blob: 97172f7c0a6a61f824adffaf2c85bb9eabd8f267 [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
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300336static inline int l2cap_send_sframe(struct l2cap_pinfo *pi, u16 control)
337{
338 struct sk_buff *skb;
339 struct l2cap_hdr *lh;
340 struct l2cap_conn *conn = pi->conn;
341 int count;
342
343 BT_DBG("pi %p, control 0x%2.2x", pi, control);
344
345 count = min_t(unsigned int, conn->mtu, L2CAP_HDR_SIZE + 2);
346 control |= L2CAP_CTRL_FRAME_TYPE;
347
348 skb = bt_skb_alloc(count, GFP_ATOMIC);
349 if (!skb)
350 return -ENOMEM;
351
352 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
353 lh->len = cpu_to_le16(2);
354 lh->cid = cpu_to_le16(pi->dcid);
355 put_unaligned_le16(control, skb_put(skb, 2));
356
357 return hci_send_acl(pi->conn->hcon, skb, 0);
358}
359
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200360static void l2cap_do_start(struct sock *sk)
361{
362 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
363
364 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +0100365 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
366 return;
367
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100368 if (l2cap_check_security(sk)) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200369 struct l2cap_conn_req req;
370 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
371 req.psm = l2cap_pi(sk)->psm;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200372
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200373 l2cap_pi(sk)->ident = l2cap_get_ident(conn);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200374
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200375 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200376 L2CAP_CONN_REQ, sizeof(req), &req);
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200377 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200378 } else {
379 struct l2cap_info_req req;
380 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
381
382 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
383 conn->info_ident = l2cap_get_ident(conn);
384
385 mod_timer(&conn->info_timer, jiffies +
386 msecs_to_jiffies(L2CAP_INFO_TIMEOUT));
387
388 l2cap_send_cmd(conn, conn->info_ident,
389 L2CAP_INFO_REQ, sizeof(req), &req);
390 }
391}
392
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -0300393static void l2cap_send_disconn_req(struct l2cap_conn *conn, struct sock *sk)
394{
395 struct l2cap_disconn_req req;
396
397 req.dcid = cpu_to_le16(l2cap_pi(sk)->dcid);
398 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
399 l2cap_send_cmd(conn, l2cap_get_ident(conn),
400 L2CAP_DISCONN_REQ, sizeof(req), &req);
401}
402
Linus Torvalds1da177e2005-04-16 15:20:36 -0700403/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200404static void l2cap_conn_start(struct l2cap_conn *conn)
405{
406 struct l2cap_chan_list *l = &conn->chan_list;
407 struct sock *sk;
408
409 BT_DBG("conn %p", conn);
410
411 read_lock(&l->lock);
412
413 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
414 bh_lock_sock(sk);
415
416 if (sk->sk_type != SOCK_SEQPACKET) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200417 bh_unlock_sock(sk);
418 continue;
419 }
420
421 if (sk->sk_state == BT_CONNECT) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100422 if (l2cap_check_security(sk)) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200423 struct l2cap_conn_req req;
424 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
425 req.psm = l2cap_pi(sk)->psm;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200426
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200427 l2cap_pi(sk)->ident = l2cap_get_ident(conn);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200428
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200429 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200430 L2CAP_CONN_REQ, sizeof(req), &req);
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200431 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200432 } else if (sk->sk_state == BT_CONNECT2) {
433 struct l2cap_conn_rsp rsp;
434 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
435 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
436
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100437 if (l2cap_check_security(sk)) {
Marcel Holtmannf66dc812009-01-15 21:57:00 +0100438 if (bt_sk(sk)->defer_setup) {
439 struct sock *parent = bt_sk(sk)->parent;
440 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
441 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
442 parent->sk_data_ready(parent, 0);
443
444 } else {
445 sk->sk_state = BT_CONFIG;
446 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
447 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
448 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200449 } else {
450 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
451 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
452 }
453
454 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
455 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
456 }
457
458 bh_unlock_sock(sk);
459 }
460
461 read_unlock(&l->lock);
462}
463
464static void l2cap_conn_ready(struct l2cap_conn *conn)
465{
466 struct l2cap_chan_list *l = &conn->chan_list;
467 struct sock *sk;
468
469 BT_DBG("conn %p", conn);
470
471 read_lock(&l->lock);
472
473 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
474 bh_lock_sock(sk);
475
476 if (sk->sk_type != SOCK_SEQPACKET) {
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200477 l2cap_sock_clear_timer(sk);
478 sk->sk_state = BT_CONNECTED;
479 sk->sk_state_change(sk);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200480 } else if (sk->sk_state == BT_CONNECT)
481 l2cap_do_start(sk);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200482
483 bh_unlock_sock(sk);
484 }
485
486 read_unlock(&l->lock);
487}
488
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200489/* Notify sockets that we cannot guaranty reliability anymore */
490static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
491{
492 struct l2cap_chan_list *l = &conn->chan_list;
493 struct sock *sk;
494
495 BT_DBG("conn %p", conn);
496
497 read_lock(&l->lock);
498
499 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100500 if (l2cap_pi(sk)->force_reliable)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200501 sk->sk_err = err;
502 }
503
504 read_unlock(&l->lock);
505}
506
507static void l2cap_info_timeout(unsigned long arg)
508{
509 struct l2cap_conn *conn = (void *) arg;
510
Marcel Holtmann984947d2009-02-06 23:35:19 +0100511 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +0100512 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +0100513
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200514 l2cap_conn_start(conn);
515}
516
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status)
518{
Marcel Holtmann01394182006-07-03 10:02:46 +0200519 struct l2cap_conn *conn = hcon->l2cap_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700520
Marcel Holtmann01394182006-07-03 10:02:46 +0200521 if (conn || status)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 return conn;
523
Marcel Holtmann01394182006-07-03 10:02:46 +0200524 conn = kzalloc(sizeof(struct l2cap_conn), GFP_ATOMIC);
525 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527
528 hcon->l2cap_data = conn;
529 conn->hcon = hcon;
530
Marcel Holtmann01394182006-07-03 10:02:46 +0200531 BT_DBG("hcon %p conn %p", hcon, conn);
532
Linus Torvalds1da177e2005-04-16 15:20:36 -0700533 conn->mtu = hcon->hdev->acl_mtu;
534 conn->src = &hcon->hdev->bdaddr;
535 conn->dst = &hcon->dst;
536
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200537 conn->feat_mask = 0;
538
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200539 setup_timer(&conn->info_timer, l2cap_info_timeout,
540 (unsigned long) conn);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200541
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542 spin_lock_init(&conn->lock);
543 rwlock_init(&conn->chan_list.lock);
544
Marcel Holtmann2950f212009-02-12 14:02:50 +0100545 conn->disc_reason = 0x13;
546
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 return conn;
548}
549
Marcel Holtmann01394182006-07-03 10:02:46 +0200550static void l2cap_conn_del(struct hci_conn *hcon, int err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551{
Marcel Holtmann01394182006-07-03 10:02:46 +0200552 struct l2cap_conn *conn = hcon->l2cap_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 struct sock *sk;
554
Marcel Holtmann01394182006-07-03 10:02:46 +0200555 if (!conn)
556 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557
558 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
559
Wei Yongjun7585b972009-02-25 18:29:52 +0800560 kfree_skb(conn->rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561
562 /* Kill channels */
563 while ((sk = conn->chan_list.head)) {
564 bh_lock_sock(sk);
565 l2cap_chan_del(sk, err);
566 bh_unlock_sock(sk);
567 l2cap_sock_kill(sk);
568 }
569
Dave Young8e8440f2008-03-03 12:18:55 -0800570 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
571 del_timer_sync(&conn->info_timer);
Thomas Gleixner3ab22732008-02-26 17:42:56 -0800572
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573 hcon->l2cap_data = NULL;
574 kfree(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575}
576
577static inline void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent)
578{
579 struct l2cap_chan_list *l = &conn->chan_list;
Marcel Holtmannfd1278d2006-07-12 23:00:07 +0200580 write_lock_bh(&l->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581 __l2cap_chan_add(conn, sk, parent);
Marcel Holtmannfd1278d2006-07-12 23:00:07 +0200582 write_unlock_bh(&l->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583}
584
Linus Torvalds1da177e2005-04-16 15:20:36 -0700585/* ---- Socket interface ---- */
Al Viro8e036fc2007-07-29 00:16:36 -0700586static struct sock *__l2cap_get_sock_by_addr(__le16 psm, bdaddr_t *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587{
588 struct sock *sk;
589 struct hlist_node *node;
590 sk_for_each(sk, node, &l2cap_sk_list.head)
591 if (l2cap_pi(sk)->sport == psm && !bacmp(&bt_sk(sk)->src, src))
592 goto found;
593 sk = NULL;
594found:
595 return sk;
596}
597
598/* Find socket with psm and source bdaddr.
599 * Returns closest match.
600 */
Al Viro8e036fc2007-07-29 00:16:36 -0700601static struct sock *__l2cap_get_sock_by_psm(int state, __le16 psm, bdaddr_t *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602{
603 struct sock *sk = NULL, *sk1 = NULL;
604 struct hlist_node *node;
605
606 sk_for_each(sk, node, &l2cap_sk_list.head) {
607 if (state && sk->sk_state != state)
608 continue;
609
610 if (l2cap_pi(sk)->psm == psm) {
611 /* Exact match. */
612 if (!bacmp(&bt_sk(sk)->src, src))
613 break;
614
615 /* Closest match */
616 if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY))
617 sk1 = sk;
618 }
619 }
620 return node ? sk : sk1;
621}
622
623/* Find socket with given address (psm, src).
624 * Returns locked socket */
Al Viro8e036fc2007-07-29 00:16:36 -0700625static inline struct sock *l2cap_get_sock_by_psm(int state, __le16 psm, bdaddr_t *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626{
627 struct sock *s;
628 read_lock(&l2cap_sk_list.lock);
629 s = __l2cap_get_sock_by_psm(state, psm, src);
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -0300630 if (s)
631 bh_lock_sock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700632 read_unlock(&l2cap_sk_list.lock);
633 return s;
634}
635
636static void l2cap_sock_destruct(struct sock *sk)
637{
638 BT_DBG("sk %p", sk);
639
640 skb_queue_purge(&sk->sk_receive_queue);
641 skb_queue_purge(&sk->sk_write_queue);
642}
643
644static void l2cap_sock_cleanup_listen(struct sock *parent)
645{
646 struct sock *sk;
647
648 BT_DBG("parent %p", parent);
649
650 /* Close not yet accepted channels */
651 while ((sk = bt_accept_dequeue(parent, NULL)))
652 l2cap_sock_close(sk);
653
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200654 parent->sk_state = BT_CLOSED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655 sock_set_flag(parent, SOCK_ZAPPED);
656}
657
658/* Kill socket (only if zapped and orphan)
659 * Must be called on unlocked socket.
660 */
661static void l2cap_sock_kill(struct sock *sk)
662{
663 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
664 return;
665
666 BT_DBG("sk %p state %d", sk, sk->sk_state);
667
668 /* Kill poor orphan */
669 bt_sock_unlink(&l2cap_sk_list, sk);
670 sock_set_flag(sk, SOCK_DEAD);
671 sock_put(sk);
672}
673
674static void __l2cap_sock_close(struct sock *sk, int reason)
675{
676 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
677
678 switch (sk->sk_state) {
679 case BT_LISTEN:
680 l2cap_sock_cleanup_listen(sk);
681 break;
682
683 case BT_CONNECTED:
684 case BT_CONFIG:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685 if (sk->sk_type == SOCK_SEQPACKET) {
686 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700687
688 sk->sk_state = BT_DISCONN;
689 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -0300690 l2cap_send_disconn_req(conn, sk);
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200691 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692 l2cap_chan_del(sk, reason);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693 break;
694
Marcel Holtmannf66dc812009-01-15 21:57:00 +0100695 case BT_CONNECT2:
696 if (sk->sk_type == SOCK_SEQPACKET) {
697 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
698 struct l2cap_conn_rsp rsp;
699 __u16 result;
700
701 if (bt_sk(sk)->defer_setup)
702 result = L2CAP_CR_SEC_BLOCK;
703 else
704 result = L2CAP_CR_BAD_PSM;
705
706 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
707 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
708 rsp.result = cpu_to_le16(result);
709 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
710 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
711 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
712 } else
713 l2cap_chan_del(sk, reason);
714 break;
715
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 case BT_CONNECT:
717 case BT_DISCONN:
718 l2cap_chan_del(sk, reason);
719 break;
720
721 default:
722 sock_set_flag(sk, SOCK_ZAPPED);
723 break;
724 }
725}
726
727/* Must be called on unlocked socket. */
728static void l2cap_sock_close(struct sock *sk)
729{
730 l2cap_sock_clear_timer(sk);
731 lock_sock(sk);
732 __l2cap_sock_close(sk, ECONNRESET);
733 release_sock(sk);
734 l2cap_sock_kill(sk);
735}
736
737static void l2cap_sock_init(struct sock *sk, struct sock *parent)
738{
739 struct l2cap_pinfo *pi = l2cap_pi(sk);
740
741 BT_DBG("sk %p", sk);
742
743 if (parent) {
744 sk->sk_type = parent->sk_type;
Marcel Holtmannf66dc812009-01-15 21:57:00 +0100745 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
746
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747 pi->imtu = l2cap_pi(parent)->imtu;
748 pi->omtu = l2cap_pi(parent)->omtu;
Marcel Holtmannc6b03cf2009-05-02 22:31:10 -0700749 pi->mode = l2cap_pi(parent)->mode;
750 pi->fcs = l2cap_pi(parent)->fcs;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100751 pi->sec_level = l2cap_pi(parent)->sec_level;
752 pi->role_switch = l2cap_pi(parent)->role_switch;
753 pi->force_reliable = l2cap_pi(parent)->force_reliable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700754 } else {
755 pi->imtu = L2CAP_DEFAULT_MTU;
756 pi->omtu = 0;
Marcel Holtmannc6b03cf2009-05-02 22:31:10 -0700757 pi->mode = L2CAP_MODE_BASIC;
758 pi->fcs = L2CAP_FCS_CRC16;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100759 pi->sec_level = BT_SECURITY_LOW;
760 pi->role_switch = 0;
761 pi->force_reliable = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700762 }
763
764 /* Default config options */
Marcel Holtmann5dee9e72007-05-24 14:27:19 +0200765 pi->conf_len = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766 pi->flush_to = L2CAP_DEFAULT_FLUSH_TO;
767}
768
769static struct proto l2cap_proto = {
770 .name = "L2CAP",
771 .owner = THIS_MODULE,
772 .obj_size = sizeof(struct l2cap_pinfo)
773};
774
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700775static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776{
777 struct sock *sk;
778
Pavel Emelyanov6257ff22007-11-01 00:39:31 -0700779 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700780 if (!sk)
781 return NULL;
782
783 sock_init_data(sock, sk);
784 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
785
786 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200787 sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788
789 sock_reset_flag(sk, SOCK_ZAPPED);
790
791 sk->sk_protocol = proto;
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200792 sk->sk_state = BT_OPEN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200794 setup_timer(&sk->sk_timer, l2cap_sock_timeout, (unsigned long) sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795
796 bt_sock_link(&l2cap_sk_list, sk);
797 return sk;
798}
799
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700800static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801{
802 struct sock *sk;
803
804 BT_DBG("sock %p", sock);
805
806 sock->state = SS_UNCONNECTED;
807
808 if (sock->type != SOCK_SEQPACKET &&
809 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
810 return -ESOCKTNOSUPPORT;
811
812 if (sock->type == SOCK_RAW && !capable(CAP_NET_RAW))
813 return -EPERM;
814
815 sock->ops = &l2cap_sock_ops;
816
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700817 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818 if (!sk)
819 return -ENOMEM;
820
821 l2cap_sock_init(sk, NULL);
822 return 0;
823}
824
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100825static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700826{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827 struct sock *sk = sock->sk;
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100828 struct sockaddr_l2 la;
829 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700830
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100831 BT_DBG("sk %p", sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700832
833 if (!addr || addr->sa_family != AF_BLUETOOTH)
834 return -EINVAL;
835
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100836 memset(&la, 0, sizeof(la));
837 len = min_t(unsigned int, sizeof(la), alen);
838 memcpy(&la, addr, len);
839
Marcel Holtmann2a517ca2009-02-16 03:20:31 +0100840 if (la.l2_cid)
841 return -EINVAL;
842
Linus Torvalds1da177e2005-04-16 15:20:36 -0700843 lock_sock(sk);
844
845 if (sk->sk_state != BT_OPEN) {
846 err = -EBADFD;
847 goto done;
848 }
849
Marcel Holtmannb4324b52009-06-07 18:06:51 +0200850 if (la.l2_psm && __le16_to_cpu(la.l2_psm) < 0x1001 &&
Marcel Holtmann847641d2007-01-22 22:00:45 +0100851 !capable(CAP_NET_BIND_SERVICE)) {
852 err = -EACCES;
853 goto done;
854 }
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900855
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856 write_lock_bh(&l2cap_sk_list.lock);
857
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100858 if (la.l2_psm && __l2cap_get_sock_by_addr(la.l2_psm, &la.l2_bdaddr)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859 err = -EADDRINUSE;
860 } else {
861 /* Save source address */
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100862 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
863 l2cap_pi(sk)->psm = la.l2_psm;
864 l2cap_pi(sk)->sport = la.l2_psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865 sk->sk_state = BT_BOUND;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100866
Marcel Holtmannb4324b52009-06-07 18:06:51 +0200867 if (__le16_to_cpu(la.l2_psm) == 0x0001 ||
868 __le16_to_cpu(la.l2_psm) == 0x0003)
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100869 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870 }
871
872 write_unlock_bh(&l2cap_sk_list.lock);
873
874done:
875 release_sock(sk);
876 return err;
877}
878
879static int l2cap_do_connect(struct sock *sk)
880{
881 bdaddr_t *src = &bt_sk(sk)->src;
882 bdaddr_t *dst = &bt_sk(sk)->dst;
883 struct l2cap_conn *conn;
884 struct hci_conn *hcon;
885 struct hci_dev *hdev;
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200886 __u8 auth_type;
Marcel Holtmann44d0e482009-04-20 07:09:16 +0200887 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100889 BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst),
890 l2cap_pi(sk)->psm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700891
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -0300892 hdev = hci_get_route(dst, src);
893 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894 return -EHOSTUNREACH;
895
896 hci_dev_lock_bh(hdev);
897
898 err = -ENOMEM;
899
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100900 if (sk->sk_type == SOCK_RAW) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100901 switch (l2cap_pi(sk)->sec_level) {
902 case BT_SECURITY_HIGH:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100903 auth_type = HCI_AT_DEDICATED_BONDING_MITM;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100904 break;
905 case BT_SECURITY_MEDIUM:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100906 auth_type = HCI_AT_DEDICATED_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100907 break;
908 default:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100909 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100910 break;
911 }
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100912 } else if (l2cap_pi(sk)->psm == cpu_to_le16(0x0001)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100913 if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH)
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200914 auth_type = HCI_AT_NO_BONDING_MITM;
915 else
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200916 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann435fef22009-02-09 03:55:28 +0100917
918 if (l2cap_pi(sk)->sec_level == BT_SECURITY_LOW)
919 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100920 } else {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100921 switch (l2cap_pi(sk)->sec_level) {
922 case BT_SECURITY_HIGH:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100923 auth_type = HCI_AT_GENERAL_BONDING_MITM;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100924 break;
925 case BT_SECURITY_MEDIUM:
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200926 auth_type = HCI_AT_GENERAL_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100927 break;
928 default:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100929 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100930 break;
931 }
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200932 }
933
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100934 hcon = hci_connect(hdev, ACL_LINK, dst,
935 l2cap_pi(sk)->sec_level, auth_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936 if (!hcon)
937 goto done;
938
939 conn = l2cap_conn_add(hcon, 0);
940 if (!conn) {
941 hci_conn_put(hcon);
942 goto done;
943 }
944
945 err = 0;
946
947 /* Update source addr of the socket */
948 bacpy(src, conn->src);
949
950 l2cap_chan_add(conn, sk, NULL);
951
952 sk->sk_state = BT_CONNECT;
953 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
954
955 if (hcon->state == BT_CONNECTED) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200956 if (sk->sk_type != SOCK_SEQPACKET) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957 l2cap_sock_clear_timer(sk);
958 sk->sk_state = BT_CONNECTED;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200959 } else
960 l2cap_do_start(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700961 }
962
963done:
964 hci_dev_unlock_bh(hdev);
965 hci_dev_put(hdev);
966 return err;
967}
968
969static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
970{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700971 struct sock *sk = sock->sk;
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100972 struct sockaddr_l2 la;
973 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700974
Linus Torvalds1da177e2005-04-16 15:20:36 -0700975 BT_DBG("sk %p", sk);
976
Marcel Holtmann2a517ca2009-02-16 03:20:31 +0100977 if (!addr || addr->sa_family != AF_BLUETOOTH)
978 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100980 memset(&la, 0, sizeof(la));
981 len = min_t(unsigned int, sizeof(la), alen);
982 memcpy(&la, addr, len);
983
Marcel Holtmann2a517ca2009-02-16 03:20:31 +0100984 if (la.l2_cid)
985 return -EINVAL;
986
987 lock_sock(sk);
988
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100989 if (sk->sk_type == SOCK_SEQPACKET && !la.l2_psm) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700990 err = -EINVAL;
991 goto done;
992 }
993
Marcel Holtmannc6b03cf2009-05-02 22:31:10 -0700994 switch (l2cap_pi(sk)->mode) {
995 case L2CAP_MODE_BASIC:
996 break;
997 case L2CAP_MODE_ERTM:
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -0300998 case L2CAP_MODE_STREAMING:
Marcel Holtmannc6b03cf2009-05-02 22:31:10 -0700999 if (enable_ertm)
1000 break;
1001 /* fall through */
1002 default:
1003 err = -ENOTSUPP;
1004 goto done;
1005 }
1006
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001007 switch (sk->sk_state) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008 case BT_CONNECT:
1009 case BT_CONNECT2:
1010 case BT_CONFIG:
1011 /* Already connecting */
1012 goto wait;
1013
1014 case BT_CONNECTED:
1015 /* Already connected */
1016 goto done;
1017
1018 case BT_OPEN:
1019 case BT_BOUND:
1020 /* Can connect */
1021 break;
1022
1023 default:
1024 err = -EBADFD;
1025 goto done;
1026 }
1027
1028 /* Set destination address and psm */
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001029 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
1030 l2cap_pi(sk)->psm = la.l2_psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001031
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001032 err = l2cap_do_connect(sk);
1033 if (err)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034 goto done;
1035
1036wait:
1037 err = bt_sock_wait_state(sk, BT_CONNECTED,
1038 sock_sndtimeo(sk, flags & O_NONBLOCK));
1039done:
1040 release_sock(sk);
1041 return err;
1042}
1043
1044static int l2cap_sock_listen(struct socket *sock, int backlog)
1045{
1046 struct sock *sk = sock->sk;
1047 int err = 0;
1048
1049 BT_DBG("sk %p backlog %d", sk, backlog);
1050
1051 lock_sock(sk);
1052
1053 if (sk->sk_state != BT_BOUND || sock->type != SOCK_SEQPACKET) {
1054 err = -EBADFD;
1055 goto done;
1056 }
1057
Marcel Holtmannc6b03cf2009-05-02 22:31:10 -07001058 switch (l2cap_pi(sk)->mode) {
1059 case L2CAP_MODE_BASIC:
1060 break;
1061 case L2CAP_MODE_ERTM:
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03001062 case L2CAP_MODE_STREAMING:
Marcel Holtmannc6b03cf2009-05-02 22:31:10 -07001063 if (enable_ertm)
1064 break;
1065 /* fall through */
1066 default:
1067 err = -ENOTSUPP;
1068 goto done;
1069 }
1070
Linus Torvalds1da177e2005-04-16 15:20:36 -07001071 if (!l2cap_pi(sk)->psm) {
1072 bdaddr_t *src = &bt_sk(sk)->src;
1073 u16 psm;
1074
1075 err = -EINVAL;
1076
1077 write_lock_bh(&l2cap_sk_list.lock);
1078
1079 for (psm = 0x1001; psm < 0x1100; psm += 2)
Marcel Holtmannb4324b52009-06-07 18:06:51 +02001080 if (!__l2cap_get_sock_by_addr(cpu_to_le16(psm), src)) {
1081 l2cap_pi(sk)->psm = cpu_to_le16(psm);
1082 l2cap_pi(sk)->sport = cpu_to_le16(psm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083 err = 0;
1084 break;
1085 }
1086
1087 write_unlock_bh(&l2cap_sk_list.lock);
1088
1089 if (err < 0)
1090 goto done;
1091 }
1092
1093 sk->sk_max_ack_backlog = backlog;
1094 sk->sk_ack_backlog = 0;
1095 sk->sk_state = BT_LISTEN;
1096
1097done:
1098 release_sock(sk);
1099 return err;
1100}
1101
1102static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
1103{
1104 DECLARE_WAITQUEUE(wait, current);
1105 struct sock *sk = sock->sk, *nsk;
1106 long timeo;
1107 int err = 0;
1108
Peter Zijlstrafcc70d52006-11-08 22:44:35 -08001109 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001110
1111 if (sk->sk_state != BT_LISTEN) {
1112 err = -EBADFD;
1113 goto done;
1114 }
1115
1116 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
1117
1118 BT_DBG("sk %p timeo %ld", sk, timeo);
1119
1120 /* Wait for an incoming connection. (wake-one). */
1121 add_wait_queue_exclusive(sk->sk_sleep, &wait);
1122 while (!(nsk = bt_accept_dequeue(sk, newsock))) {
1123 set_current_state(TASK_INTERRUPTIBLE);
1124 if (!timeo) {
1125 err = -EAGAIN;
1126 break;
1127 }
1128
1129 release_sock(sk);
1130 timeo = schedule_timeout(timeo);
Peter Zijlstrafcc70d52006-11-08 22:44:35 -08001131 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132
1133 if (sk->sk_state != BT_LISTEN) {
1134 err = -EBADFD;
1135 break;
1136 }
1137
1138 if (signal_pending(current)) {
1139 err = sock_intr_errno(timeo);
1140 break;
1141 }
1142 }
1143 set_current_state(TASK_RUNNING);
1144 remove_wait_queue(sk->sk_sleep, &wait);
1145
1146 if (err)
1147 goto done;
1148
1149 newsock->state = SS_CONNECTED;
1150
1151 BT_DBG("new socket %p", nsk);
1152
1153done:
1154 release_sock(sk);
1155 return err;
1156}
1157
1158static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
1159{
1160 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
1161 struct sock *sk = sock->sk;
1162
1163 BT_DBG("sock %p, sk %p", sock, sk);
1164
1165 addr->sa_family = AF_BLUETOOTH;
1166 *len = sizeof(struct sockaddr_l2);
1167
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001168 if (peer) {
1169 la->l2_psm = l2cap_pi(sk)->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Marcel Holtmannb4324b52009-06-07 18:06:51 +02001171 la->l2_cid = cpu_to_le16(l2cap_pi(sk)->dcid);
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001172 } else {
1173 la->l2_psm = l2cap_pi(sk)->sport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Marcel Holtmannb4324b52009-06-07 18:06:51 +02001175 la->l2_cid = cpu_to_le16(l2cap_pi(sk)->scid);
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001176 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177
Linus Torvalds1da177e2005-04-16 15:20:36 -07001178 return 0;
1179}
1180
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001181static void l2cap_monitor_timeout(unsigned long arg)
1182{
1183 struct sock *sk = (void *) arg;
1184 u16 control;
1185
1186 if (l2cap_pi(sk)->retry_count >= l2cap_pi(sk)->remote_max_tx) {
1187 l2cap_send_disconn_req(l2cap_pi(sk)->conn, sk);
1188 return;
1189 }
1190
1191 l2cap_pi(sk)->retry_count++;
1192 __mod_monitor_timer();
1193
1194 control = L2CAP_CTRL_POLL;
1195 control |= L2CAP_SUPER_RCV_READY;
1196 l2cap_send_sframe(l2cap_pi(sk), control);
1197}
1198
1199static void l2cap_retrans_timeout(unsigned long arg)
1200{
1201 struct sock *sk = (void *) arg;
1202 u16 control;
1203
1204 l2cap_pi(sk)->retry_count = 1;
1205 __mod_monitor_timer();
1206
1207 l2cap_pi(sk)->conn_state |= L2CAP_CONN_WAIT_F;
1208
1209 control = L2CAP_CTRL_POLL;
1210 control |= L2CAP_SUPER_RCV_READY;
1211 l2cap_send_sframe(l2cap_pi(sk), control);
1212}
1213
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001214static void l2cap_drop_acked_frames(struct sock *sk)
1215{
1216 struct sk_buff *skb;
1217
1218 while ((skb = skb_peek(TX_QUEUE(sk)))) {
1219 if (bt_cb(skb)->tx_seq == l2cap_pi(sk)->expected_ack_seq)
1220 break;
1221
1222 skb = skb_dequeue(TX_QUEUE(sk));
1223 kfree_skb(skb);
1224
1225 l2cap_pi(sk)->unacked_frames--;
1226 }
1227
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001228 if (!l2cap_pi(sk)->unacked_frames)
1229 del_timer(&l2cap_pi(sk)->retrans_timer);
1230
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001231 return;
1232}
1233
1234static inline int l2cap_do_send(struct sock *sk, struct sk_buff *skb)
1235{
1236 struct l2cap_pinfo *pi = l2cap_pi(sk);
1237 int err;
1238
1239 BT_DBG("sk %p, skb %p len %d", sk, skb, skb->len);
1240
1241 err = hci_send_acl(pi->conn->hcon, skb, 0);
1242 if (err < 0)
1243 kfree_skb(skb);
1244
1245 return err;
1246}
1247
1248static int l2cap_ertm_send(struct sock *sk)
1249{
1250 struct sk_buff *skb, *tx_skb;
1251 struct l2cap_pinfo *pi = l2cap_pi(sk);
1252 u16 control;
1253 int err;
1254
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001255 if (pi->conn_state & L2CAP_CONN_WAIT_F)
1256 return 0;
1257
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001258 while ((skb = sk->sk_send_head) && (!l2cap_tx_window_full(sk))) {
1259 tx_skb = skb_clone(skb, GFP_ATOMIC);
1260
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001261 if (pi->remote_max_tx &&
1262 bt_cb(skb)->retries == pi->remote_max_tx) {
1263 l2cap_send_disconn_req(pi->conn, sk);
1264 break;
1265 }
1266
1267 bt_cb(skb)->retries++;
1268
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001269 control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE);
1270 control |= (pi->req_seq << L2CAP_CTRL_REQSEQ_SHIFT)
1271 | (pi->next_tx_seq << L2CAP_CTRL_TXSEQ_SHIFT);
1272 put_unaligned_le16(control, tx_skb->data + L2CAP_HDR_SIZE);
1273
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001274
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001275 err = l2cap_do_send(sk, tx_skb);
1276 if (err < 0) {
1277 l2cap_send_disconn_req(pi->conn, sk);
1278 return err;
1279 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001280 __mod_retrans_timer();
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001281
1282 bt_cb(skb)->tx_seq = pi->next_tx_seq;
1283 pi->next_tx_seq = (pi->next_tx_seq + 1) % 64;
1284
1285 pi->unacked_frames++;
1286
1287 if (skb_queue_is_last(TX_QUEUE(sk), skb))
1288 sk->sk_send_head = NULL;
1289 else
1290 sk->sk_send_head = skb_queue_next(TX_QUEUE(sk), skb);
1291 }
1292
1293 return 0;
1294}
1295
1296static inline int l2cap_skbuff_fromiovec(struct sock *sk, struct msghdr *msg, int len, int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001297{
1298 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001299 struct sk_buff **frag;
1300 int err, sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001301
1302 if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count)) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001303 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001304 }
1305
1306 sent += count;
1307 len -= count;
1308
1309 /* Continuation fragments (no L2CAP header) */
1310 frag = &skb_shinfo(skb)->frag_list;
1311 while (len) {
1312 count = min_t(unsigned int, conn->mtu, len);
1313
1314 *frag = bt_skb_send_alloc(sk, count, msg->msg_flags & MSG_DONTWAIT, &err);
1315 if (!*frag)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001316 return -EFAULT;
1317 if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count))
1318 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001319
1320 sent += count;
1321 len -= count;
1322
1323 frag = &(*frag)->next;
1324 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001325
1326 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001327}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001329static struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, size_t len)
1330{
1331 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
1332 struct sk_buff *skb;
1333 int err, count, hlen = L2CAP_HDR_SIZE + 2;
1334 struct l2cap_hdr *lh;
1335
1336 BT_DBG("sk %p len %d", sk, (int)len);
1337
1338 count = min_t(unsigned int, (conn->mtu - hlen), len);
1339 skb = bt_skb_send_alloc(sk, count + hlen,
1340 msg->msg_flags & MSG_DONTWAIT, &err);
1341 if (!skb)
1342 return ERR_PTR(-ENOMEM);
1343
1344 /* Create L2CAP header */
1345 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
1346 lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid);
1347 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
1348 put_unaligned_le16(l2cap_pi(sk)->psm, skb_put(skb, 2));
1349
1350 err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb);
1351 if (unlikely(err < 0)) {
1352 kfree_skb(skb);
1353 return ERR_PTR(err);
1354 }
1355 return skb;
1356}
1357
1358static struct sk_buff *l2cap_create_basic_pdu(struct sock *sk, struct msghdr *msg, size_t len)
1359{
1360 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
1361 struct sk_buff *skb;
1362 int err, count, hlen = L2CAP_HDR_SIZE;
1363 struct l2cap_hdr *lh;
1364
1365 BT_DBG("sk %p len %d", sk, (int)len);
1366
1367 count = min_t(unsigned int, (conn->mtu - hlen), len);
1368 skb = bt_skb_send_alloc(sk, count + hlen,
1369 msg->msg_flags & MSG_DONTWAIT, &err);
1370 if (!skb)
1371 return ERR_PTR(-ENOMEM);
1372
1373 /* Create L2CAP header */
1374 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
1375 lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid);
1376 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
1377
1378 err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb);
1379 if (unlikely(err < 0)) {
1380 kfree_skb(skb);
1381 return ERR_PTR(err);
1382 }
1383 return skb;
1384}
1385
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03001386static struct sk_buff *l2cap_create_ertm_pdu(struct sock *sk, struct msghdr *msg, size_t len, u16 control, u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001387{
1388 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
1389 struct sk_buff *skb;
1390 int err, count, hlen = L2CAP_HDR_SIZE + 2;
1391 struct l2cap_hdr *lh;
1392
1393 BT_DBG("sk %p len %d", sk, (int)len);
1394
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03001395 if (sdulen)
1396 hlen += 2;
1397
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001398 count = min_t(unsigned int, (conn->mtu - hlen), len);
1399 skb = bt_skb_send_alloc(sk, count + hlen,
1400 msg->msg_flags & MSG_DONTWAIT, &err);
1401 if (!skb)
1402 return ERR_PTR(-ENOMEM);
1403
1404 /* Create L2CAP header */
1405 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
1406 lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid);
1407 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
1408 put_unaligned_le16(control, skb_put(skb, 2));
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03001409 if (sdulen)
1410 put_unaligned_le16(sdulen, skb_put(skb, 2));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001411
1412 err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb);
1413 if (unlikely(err < 0)) {
1414 kfree_skb(skb);
1415 return ERR_PTR(err);
1416 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001417
1418 bt_cb(skb)->retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001419 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001420}
1421
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03001422static inline int l2cap_sar_segment_sdu(struct sock *sk, struct msghdr *msg, size_t len)
1423{
1424 struct l2cap_pinfo *pi = l2cap_pi(sk);
1425 struct sk_buff *skb;
1426 struct sk_buff_head sar_queue;
1427 u16 control;
1428 size_t size = 0;
1429
1430 __skb_queue_head_init(&sar_queue);
1431 control = L2CAP_SDU_START;
1432 skb = l2cap_create_ertm_pdu(sk, msg, pi->max_pdu_size, control, len);
1433 if (IS_ERR(skb))
1434 return PTR_ERR(skb);
1435
1436 __skb_queue_tail(&sar_queue, skb);
1437 len -= pi->max_pdu_size;
1438 size +=pi->max_pdu_size;
1439 control = 0;
1440
1441 while (len > 0) {
1442 size_t buflen;
1443
1444 if (len > pi->max_pdu_size) {
1445 control |= L2CAP_SDU_CONTINUE;
1446 buflen = pi->max_pdu_size;
1447 } else {
1448 control |= L2CAP_SDU_END;
1449 buflen = len;
1450 }
1451
1452 skb = l2cap_create_ertm_pdu(sk, msg, buflen, control, 0);
1453 if (IS_ERR(skb)) {
1454 skb_queue_purge(&sar_queue);
1455 return PTR_ERR(skb);
1456 }
1457
1458 __skb_queue_tail(&sar_queue, skb);
1459 len -= buflen;
1460 size += buflen;
1461 control = 0;
1462 }
1463 skb_queue_splice_tail(&sar_queue, TX_QUEUE(sk));
1464 if (sk->sk_send_head == NULL)
1465 sk->sk_send_head = sar_queue.next;
1466
1467 return size;
1468}
1469
Linus Torvalds1da177e2005-04-16 15:20:36 -07001470static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
1471{
1472 struct sock *sk = sock->sk;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001473 struct l2cap_pinfo *pi = l2cap_pi(sk);
1474 struct sk_buff *skb;
1475 u16 control;
1476 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477
1478 BT_DBG("sock %p, sk %p", sock, sk);
1479
Benjamin LaHaisec1cbe4b2005-12-13 23:22:19 -08001480 err = sock_error(sk);
1481 if (err)
1482 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001483
1484 if (msg->msg_flags & MSG_OOB)
1485 return -EOPNOTSUPP;
1486
1487 /* Check outgoing MTU */
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001488 if (sk->sk_type == SOCK_SEQPACKET && pi->mode == L2CAP_MODE_BASIC
1489 && len > pi->omtu)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490 return -EINVAL;
1491
1492 lock_sock(sk);
1493
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001494 if (sk->sk_state != BT_CONNECTED) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001495 err = -ENOTCONN;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001496 goto done;
1497 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001498
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001499 /* Connectionless channel */
1500 if (sk->sk_type == SOCK_DGRAM) {
1501 skb = l2cap_create_connless_pdu(sk, msg, len);
1502 err = l2cap_do_send(sk, skb);
1503 goto done;
1504 }
1505
1506 switch (pi->mode) {
1507 case L2CAP_MODE_BASIC:
1508 /* Create a basic PDU */
1509 skb = l2cap_create_basic_pdu(sk, msg, len);
1510 if (IS_ERR(skb)) {
1511 err = PTR_ERR(skb);
1512 goto done;
1513 }
1514
1515 err = l2cap_do_send(sk, skb);
1516 if (!err)
1517 err = len;
1518 break;
1519
1520 case L2CAP_MODE_ERTM:
1521 /* Entire SDU fits into one PDU */
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03001522 if (len <= pi->max_pdu_size) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001523 control = L2CAP_SDU_UNSEGMENTED;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03001524 skb = l2cap_create_ertm_pdu(sk, msg, len, control, 0);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001525 if (IS_ERR(skb)) {
1526 err = PTR_ERR(skb);
1527 goto done;
1528 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03001529 __skb_queue_tail(TX_QUEUE(sk), skb);
1530 if (sk->sk_send_head == NULL)
1531 sk->sk_send_head = skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001532 } else {
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03001533 /* Segment SDU into multiples PDUs */
1534 err = l2cap_sar_segment_sdu(sk, msg, len);
1535 if (err < 0)
1536 goto done;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001537 }
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001538
1539 err = l2cap_ertm_send(sk);
1540 if (!err)
1541 err = len;
1542 break;
1543
1544 default:
1545 BT_DBG("bad state %1.1x", pi->mode);
1546 err = -EINVAL;
1547 }
1548
1549done:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001550 release_sock(sk);
1551 return err;
1552}
1553
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001554static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
1555{
1556 struct sock *sk = sock->sk;
1557
1558 lock_sock(sk);
1559
1560 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
1561 struct l2cap_conn_rsp rsp;
1562
1563 sk->sk_state = BT_CONFIG;
1564
1565 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
1566 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
1567 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1568 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
1569 l2cap_send_cmd(l2cap_pi(sk)->conn, l2cap_pi(sk)->ident,
1570 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
1571
1572 release_sock(sk);
1573 return 0;
1574 }
1575
1576 release_sock(sk);
1577
1578 return bt_sock_recvmsg(iocb, sock, msg, len, flags);
1579}
1580
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001581static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582{
1583 struct sock *sk = sock->sk;
1584 struct l2cap_options opts;
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001585 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586 u32 opt;
1587
1588 BT_DBG("sk %p", sk);
1589
1590 lock_sock(sk);
1591
1592 switch (optname) {
1593 case L2CAP_OPTIONS:
Marcel Holtmann0878b662007-05-05 00:35:59 +02001594 opts.imtu = l2cap_pi(sk)->imtu;
1595 opts.omtu = l2cap_pi(sk)->omtu;
1596 opts.flush_to = l2cap_pi(sk)->flush_to;
Marcel Holtmannc6b03cf2009-05-02 22:31:10 -07001597 opts.mode = l2cap_pi(sk)->mode;
Marcel Holtmann0878b662007-05-05 00:35:59 +02001598
Linus Torvalds1da177e2005-04-16 15:20:36 -07001599 len = min_t(unsigned int, sizeof(opts), optlen);
1600 if (copy_from_user((char *) &opts, optval, len)) {
1601 err = -EFAULT;
1602 break;
1603 }
Marcel Holtmann0878b662007-05-05 00:35:59 +02001604
Marcel Holtmannc6b03cf2009-05-02 22:31:10 -07001605 l2cap_pi(sk)->imtu = opts.imtu;
1606 l2cap_pi(sk)->omtu = opts.omtu;
1607 l2cap_pi(sk)->mode = opts.mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001608 break;
1609
1610 case L2CAP_LM:
1611 if (get_user(opt, (u32 __user *) optval)) {
1612 err = -EFAULT;
1613 break;
1614 }
1615
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001616 if (opt & L2CAP_LM_AUTH)
1617 l2cap_pi(sk)->sec_level = BT_SECURITY_LOW;
1618 if (opt & L2CAP_LM_ENCRYPT)
1619 l2cap_pi(sk)->sec_level = BT_SECURITY_MEDIUM;
1620 if (opt & L2CAP_LM_SECURE)
1621 l2cap_pi(sk)->sec_level = BT_SECURITY_HIGH;
1622
1623 l2cap_pi(sk)->role_switch = (opt & L2CAP_LM_MASTER);
1624 l2cap_pi(sk)->force_reliable = (opt & L2CAP_LM_RELIABLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001625 break;
1626
1627 default:
1628 err = -ENOPROTOOPT;
1629 break;
1630 }
1631
1632 release_sock(sk);
1633 return err;
1634}
1635
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001636static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen)
1637{
1638 struct sock *sk = sock->sk;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001639 struct bt_security sec;
1640 int len, err = 0;
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001641 u32 opt;
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001642
1643 BT_DBG("sk %p", sk);
1644
1645 if (level == SOL_L2CAP)
1646 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
1647
Marcel Holtmann0588d942009-01-16 10:06:13 +01001648 if (level != SOL_BLUETOOTH)
1649 return -ENOPROTOOPT;
1650
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001651 lock_sock(sk);
1652
1653 switch (optname) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001654 case BT_SECURITY:
Marcel Holtmann2526d3d2009-02-20 20:54:06 +01001655 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_RAW) {
Marcel Holtmann0588d942009-01-16 10:06:13 +01001656 err = -EINVAL;
1657 break;
1658 }
1659
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001660 sec.level = BT_SECURITY_LOW;
1661
1662 len = min_t(unsigned int, sizeof(sec), optlen);
1663 if (copy_from_user((char *) &sec, optval, len)) {
1664 err = -EFAULT;
1665 break;
1666 }
1667
1668 if (sec.level < BT_SECURITY_LOW ||
1669 sec.level > BT_SECURITY_HIGH) {
1670 err = -EINVAL;
1671 break;
1672 }
1673
1674 l2cap_pi(sk)->sec_level = sec.level;
1675 break;
1676
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001677 case BT_DEFER_SETUP:
1678 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
1679 err = -EINVAL;
1680 break;
1681 }
1682
1683 if (get_user(opt, (u32 __user *) optval)) {
1684 err = -EFAULT;
1685 break;
1686 }
1687
1688 bt_sk(sk)->defer_setup = opt;
1689 break;
1690
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001691 default:
1692 err = -ENOPROTOOPT;
1693 break;
1694 }
1695
1696 release_sock(sk);
1697 return err;
1698}
1699
1700static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001701{
1702 struct sock *sk = sock->sk;
1703 struct l2cap_options opts;
1704 struct l2cap_conninfo cinfo;
1705 int len, err = 0;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001706 u32 opt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001707
1708 BT_DBG("sk %p", sk);
1709
1710 if (get_user(len, optlen))
1711 return -EFAULT;
1712
1713 lock_sock(sk);
1714
1715 switch (optname) {
1716 case L2CAP_OPTIONS:
1717 opts.imtu = l2cap_pi(sk)->imtu;
1718 opts.omtu = l2cap_pi(sk)->omtu;
1719 opts.flush_to = l2cap_pi(sk)->flush_to;
Marcel Holtmannc6b03cf2009-05-02 22:31:10 -07001720 opts.mode = l2cap_pi(sk)->mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001721
1722 len = min_t(unsigned int, len, sizeof(opts));
1723 if (copy_to_user(optval, (char *) &opts, len))
1724 err = -EFAULT;
1725
1726 break;
1727
1728 case L2CAP_LM:
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001729 switch (l2cap_pi(sk)->sec_level) {
1730 case BT_SECURITY_LOW:
1731 opt = L2CAP_LM_AUTH;
1732 break;
1733 case BT_SECURITY_MEDIUM:
1734 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
1735 break;
1736 case BT_SECURITY_HIGH:
1737 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
1738 L2CAP_LM_SECURE;
1739 break;
1740 default:
1741 opt = 0;
1742 break;
1743 }
1744
1745 if (l2cap_pi(sk)->role_switch)
1746 opt |= L2CAP_LM_MASTER;
1747
1748 if (l2cap_pi(sk)->force_reliable)
1749 opt |= L2CAP_LM_RELIABLE;
1750
1751 if (put_user(opt, (u32 __user *) optval))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752 err = -EFAULT;
1753 break;
1754
1755 case L2CAP_CONNINFO:
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001756 if (sk->sk_state != BT_CONNECTED &&
1757 !(sk->sk_state == BT_CONNECT2 &&
1758 bt_sk(sk)->defer_setup)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001759 err = -ENOTCONN;
1760 break;
1761 }
1762
1763 cinfo.hci_handle = l2cap_pi(sk)->conn->hcon->handle;
1764 memcpy(cinfo.dev_class, l2cap_pi(sk)->conn->hcon->dev_class, 3);
1765
1766 len = min_t(unsigned int, len, sizeof(cinfo));
1767 if (copy_to_user(optval, (char *) &cinfo, len))
1768 err = -EFAULT;
1769
1770 break;
1771
1772 default:
1773 err = -ENOPROTOOPT;
1774 break;
1775 }
1776
1777 release_sock(sk);
1778 return err;
1779}
1780
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001781static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
1782{
1783 struct sock *sk = sock->sk;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001784 struct bt_security sec;
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001785 int len, err = 0;
1786
1787 BT_DBG("sk %p", sk);
1788
1789 if (level == SOL_L2CAP)
1790 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
1791
Marcel Holtmann0588d942009-01-16 10:06:13 +01001792 if (level != SOL_BLUETOOTH)
1793 return -ENOPROTOOPT;
1794
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001795 if (get_user(len, optlen))
1796 return -EFAULT;
1797
1798 lock_sock(sk);
1799
1800 switch (optname) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001801 case BT_SECURITY:
Marcel Holtmann2526d3d2009-02-20 20:54:06 +01001802 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_RAW) {
Marcel Holtmann0588d942009-01-16 10:06:13 +01001803 err = -EINVAL;
1804 break;
1805 }
1806
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001807 sec.level = l2cap_pi(sk)->sec_level;
1808
1809 len = min_t(unsigned int, len, sizeof(sec));
1810 if (copy_to_user(optval, (char *) &sec, len))
1811 err = -EFAULT;
1812
1813 break;
1814
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001815 case BT_DEFER_SETUP:
1816 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
1817 err = -EINVAL;
1818 break;
1819 }
1820
1821 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
1822 err = -EFAULT;
1823
1824 break;
1825
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001826 default:
1827 err = -ENOPROTOOPT;
1828 break;
1829 }
1830
1831 release_sock(sk);
1832 return err;
1833}
1834
Linus Torvalds1da177e2005-04-16 15:20:36 -07001835static int l2cap_sock_shutdown(struct socket *sock, int how)
1836{
1837 struct sock *sk = sock->sk;
1838 int err = 0;
1839
1840 BT_DBG("sock %p, sk %p", sock, sk);
1841
1842 if (!sk)
1843 return 0;
1844
1845 lock_sock(sk);
1846 if (!sk->sk_shutdown) {
1847 sk->sk_shutdown = SHUTDOWN_MASK;
1848 l2cap_sock_clear_timer(sk);
1849 __l2cap_sock_close(sk, 0);
1850
1851 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001852 err = bt_sock_wait_state(sk, BT_CLOSED,
1853 sk->sk_lingertime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001854 }
1855 release_sock(sk);
1856 return err;
1857}
1858
1859static int l2cap_sock_release(struct socket *sock)
1860{
1861 struct sock *sk = sock->sk;
1862 int err;
1863
1864 BT_DBG("sock %p, sk %p", sock, sk);
1865
1866 if (!sk)
1867 return 0;
1868
1869 err = l2cap_sock_shutdown(sock, 2);
1870
1871 sock_orphan(sk);
1872 l2cap_sock_kill(sk);
1873 return err;
1874}
1875
Linus Torvalds1da177e2005-04-16 15:20:36 -07001876static void l2cap_chan_ready(struct sock *sk)
1877{
1878 struct sock *parent = bt_sk(sk)->parent;
1879
1880 BT_DBG("sk %p, parent %p", sk, parent);
1881
1882 l2cap_pi(sk)->conf_state = 0;
1883 l2cap_sock_clear_timer(sk);
1884
1885 if (!parent) {
1886 /* Outgoing channel.
1887 * Wake up socket sleeping on connect.
1888 */
1889 sk->sk_state = BT_CONNECTED;
1890 sk->sk_state_change(sk);
1891 } else {
1892 /* Incoming channel.
1893 * Wake up socket sleeping on accept.
1894 */
1895 parent->sk_data_ready(parent, 0);
1896 }
1897}
1898
1899/* Copy frame to all raw sockets on that connection */
1900static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
1901{
1902 struct l2cap_chan_list *l = &conn->chan_list;
1903 struct sk_buff *nskb;
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001904 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001905
1906 BT_DBG("conn %p", conn);
1907
1908 read_lock(&l->lock);
1909 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
1910 if (sk->sk_type != SOCK_RAW)
1911 continue;
1912
1913 /* Don't send frame to the socket it came from */
1914 if (skb->sk == sk)
1915 continue;
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001916 nskb = skb_clone(skb, GFP_ATOMIC);
1917 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001918 continue;
1919
1920 if (sock_queue_rcv_skb(sk, nskb))
1921 kfree_skb(nskb);
1922 }
1923 read_unlock(&l->lock);
1924}
1925
1926/* ---- L2CAP signalling commands ---- */
1927static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
1928 u8 code, u8 ident, u16 dlen, void *data)
1929{
1930 struct sk_buff *skb, **frag;
1931 struct l2cap_cmd_hdr *cmd;
1932 struct l2cap_hdr *lh;
1933 int len, count;
1934
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001935 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %d",
1936 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001937
1938 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
1939 count = min_t(unsigned int, conn->mtu, len);
1940
1941 skb = bt_skb_alloc(count, GFP_ATOMIC);
1942 if (!skb)
1943 return NULL;
1944
1945 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001946 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03001947 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001948
1949 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
1950 cmd->code = code;
1951 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001952 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001953
1954 if (dlen) {
1955 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
1956 memcpy(skb_put(skb, count), data, count);
1957 data += count;
1958 }
1959
1960 len -= skb->len;
1961
1962 /* Continuation fragments (no L2CAP header) */
1963 frag = &skb_shinfo(skb)->frag_list;
1964 while (len) {
1965 count = min_t(unsigned int, conn->mtu, len);
1966
1967 *frag = bt_skb_alloc(count, GFP_ATOMIC);
1968 if (!*frag)
1969 goto fail;
1970
1971 memcpy(skb_put(*frag, count), data, count);
1972
1973 len -= count;
1974 data += count;
1975
1976 frag = &(*frag)->next;
1977 }
1978
1979 return skb;
1980
1981fail:
1982 kfree_skb(skb);
1983 return NULL;
1984}
1985
1986static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned long *val)
1987{
1988 struct l2cap_conf_opt *opt = *ptr;
1989 int len;
1990
1991 len = L2CAP_CONF_OPT_SIZE + opt->len;
1992 *ptr += len;
1993
1994 *type = opt->type;
1995 *olen = opt->len;
1996
1997 switch (opt->len) {
1998 case 1:
1999 *val = *((u8 *) opt->val);
2000 break;
2001
2002 case 2:
Marcel Holtmann861d6882007-10-20 13:37:06 +02002003 *val = __le16_to_cpu(*((__le16 *) opt->val));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002004 break;
2005
2006 case 4:
Marcel Holtmann861d6882007-10-20 13:37:06 +02002007 *val = __le32_to_cpu(*((__le32 *) opt->val));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002008 break;
2009
2010 default:
2011 *val = (unsigned long) opt->val;
2012 break;
2013 }
2014
2015 BT_DBG("type 0x%2.2x len %d val 0x%lx", *type, opt->len, *val);
2016 return len;
2017}
2018
Linus Torvalds1da177e2005-04-16 15:20:36 -07002019static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2020{
2021 struct l2cap_conf_opt *opt = *ptr;
2022
2023 BT_DBG("type 0x%2.2x len %d val 0x%lx", type, len, val);
2024
2025 opt->type = type;
2026 opt->len = len;
2027
2028 switch (len) {
2029 case 1:
2030 *((u8 *) opt->val) = val;
2031 break;
2032
2033 case 2:
Al Viro8e036fc2007-07-29 00:16:36 -07002034 *((__le16 *) opt->val) = cpu_to_le16(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002035 break;
2036
2037 case 4:
Al Viro8e036fc2007-07-29 00:16:36 -07002038 *((__le32 *) opt->val) = cpu_to_le32(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002039 break;
2040
2041 default:
2042 memcpy(opt->val, (void *) val, len);
2043 break;
2044 }
2045
2046 *ptr += L2CAP_CONF_OPT_SIZE + len;
2047}
2048
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002049static int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
2050{
2051 u32 local_feat_mask = l2cap_feat_mask;
2052 if (enable_ertm)
2053 local_feat_mask |= L2CAP_FEAT_ERTM;
2054
2055 switch (mode) {
2056 case L2CAP_MODE_ERTM:
2057 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
2058 case L2CAP_MODE_STREAMING:
2059 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
2060 default:
2061 return 0x00;
2062 }
2063}
2064
2065static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
2066{
2067 switch (mode) {
2068 case L2CAP_MODE_STREAMING:
2069 case L2CAP_MODE_ERTM:
2070 if (l2cap_mode_supported(mode, remote_feat_mask))
2071 return mode;
2072 /* fall through */
2073 default:
2074 return L2CAP_MODE_BASIC;
2075 }
2076}
2077
Linus Torvalds1da177e2005-04-16 15:20:36 -07002078static int l2cap_build_conf_req(struct sock *sk, void *data)
2079{
2080 struct l2cap_pinfo *pi = l2cap_pi(sk);
2081 struct l2cap_conf_req *req = data;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002082 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_ERTM };
Linus Torvalds1da177e2005-04-16 15:20:36 -07002083 void *ptr = req->data;
2084
2085 BT_DBG("sk %p", sk);
2086
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002087 if (pi->num_conf_req || pi->num_conf_rsp)
2088 goto done;
2089
2090 switch (pi->mode) {
2091 case L2CAP_MODE_STREAMING:
2092 case L2CAP_MODE_ERTM:
2093 pi->conf_state |= L2CAP_CONF_STATE2_DEVICE;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03002094 if (!l2cap_mode_supported(pi->mode, pi->conn->feat_mask))
2095 l2cap_send_disconn_req(pi->conn, sk);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002096 break;
2097 default:
2098 pi->mode = l2cap_select_mode(rfc.mode, pi->conn->feat_mask);
2099 break;
2100 }
2101
2102done:
Marcel Holtmann65c7c492009-05-02 23:07:53 -07002103 switch (pi->mode) {
2104 case L2CAP_MODE_BASIC:
2105 if (pi->imtu != L2CAP_DEFAULT_MTU)
2106 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu);
2107 break;
2108
2109 case L2CAP_MODE_ERTM:
2110 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002111 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002112 rfc.max_transmit = L2CAP_DEFAULT_MAX_TX;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002113 rfc.retrans_timeout = 0;
2114 rfc.monitor_timeout = 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002115 rfc.max_pdu_size = cpu_to_le16(L2CAP_DEFAULT_MAX_PDU_SIZE);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002116
2117 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
2118 sizeof(rfc), (unsigned long) &rfc);
2119 break;
2120
2121 case L2CAP_MODE_STREAMING:
2122 rfc.mode = L2CAP_MODE_STREAMING;
2123 rfc.txwin_size = 0;
2124 rfc.max_transmit = 0;
2125 rfc.retrans_timeout = 0;
2126 rfc.monitor_timeout = 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002127 rfc.max_pdu_size = cpu_to_le16(L2CAP_DEFAULT_MAX_PDU_SIZE);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07002128
2129 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
2130 sizeof(rfc), (unsigned long) &rfc);
2131 break;
2132 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002133
2134 /* FIXME: Need actual value of the flush timeout */
2135 //if (flush_to != L2CAP_DEFAULT_FLUSH_TO)
2136 // l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, 2, pi->flush_to);
2137
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002138 req->dcid = cpu_to_le16(pi->dcid);
2139 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002140
2141 return ptr - data;
2142}
2143
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002144static int l2cap_parse_conf_req(struct sock *sk, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002145{
2146 struct l2cap_pinfo *pi = l2cap_pi(sk);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002147 struct l2cap_conf_rsp *rsp = data;
2148 void *ptr = rsp->data;
2149 void *req = pi->conf_req;
2150 int len = pi->conf_len;
2151 int type, hint, olen;
2152 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02002153 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Marcel Holtmann861d6882007-10-20 13:37:06 +02002154 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002155 u16 result = L2CAP_CONF_SUCCESS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002156
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002157 BT_DBG("sk %p", sk);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01002158
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002159 while (len >= L2CAP_CONF_OPT_SIZE) {
2160 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002161
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03002162 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07002163 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002164
2165 switch (type) {
2166 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02002167 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002168 break;
2169
2170 case L2CAP_CONF_FLUSH_TO:
2171 pi->flush_to = val;
2172 break;
2173
2174 case L2CAP_CONF_QOS:
2175 break;
2176
Marcel Holtmann6464f352007-10-20 13:39:51 +02002177 case L2CAP_CONF_RFC:
2178 if (olen == sizeof(rfc))
2179 memcpy(&rfc, (void *) val, olen);
2180 break;
2181
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002182 default:
2183 if (hint)
2184 break;
2185
2186 result = L2CAP_CONF_UNKNOWN;
2187 *((u8 *) ptr++) = type;
2188 break;
2189 }
2190 }
2191
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002192 if (pi->num_conf_rsp || pi->num_conf_req)
2193 goto done;
2194
2195 switch (pi->mode) {
2196 case L2CAP_MODE_STREAMING:
2197 case L2CAP_MODE_ERTM:
2198 pi->conf_state |= L2CAP_CONF_STATE2_DEVICE;
2199 if (!l2cap_mode_supported(pi->mode, pi->conn->feat_mask))
2200 return -ECONNREFUSED;
2201 break;
2202 default:
2203 pi->mode = l2cap_select_mode(rfc.mode, pi->conn->feat_mask);
2204 break;
2205 }
2206
2207done:
2208 if (pi->mode != rfc.mode) {
2209 result = L2CAP_CONF_UNACCEPT;
2210 rfc.mode = pi->mode;
2211
2212 if (pi->num_conf_rsp == 1)
2213 return -ECONNREFUSED;
2214
2215 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
2216 sizeof(rfc), (unsigned long) &rfc);
2217 }
2218
2219
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002220 if (result == L2CAP_CONF_SUCCESS) {
2221 /* Configure output options and let the other side know
2222 * which ones we don't like. */
2223
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002224 if (mtu < L2CAP_DEFAULT_MIN_MTU)
2225 result = L2CAP_CONF_UNACCEPT;
2226 else {
2227 pi->omtu = mtu;
2228 pi->conf_state |= L2CAP_CONF_MTU_DONE;
2229 }
2230 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002231
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002232 switch (rfc.mode) {
2233 case L2CAP_MODE_BASIC:
2234 pi->fcs = L2CAP_FCS_NONE;
2235 pi->conf_state |= L2CAP_CONF_MODE_DONE;
2236 break;
2237
2238 case L2CAP_MODE_ERTM:
2239 pi->remote_tx_win = rfc.txwin_size;
2240 pi->remote_max_tx = rfc.max_transmit;
2241 pi->max_pdu_size = rfc.max_pdu_size;
2242
2243 rfc.retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
2244 rfc.monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
2245
2246 pi->conf_state |= L2CAP_CONF_MODE_DONE;
2247 break;
2248
2249 case L2CAP_MODE_STREAMING:
2250 pi->remote_tx_win = rfc.txwin_size;
2251 pi->max_pdu_size = rfc.max_pdu_size;
2252
2253 pi->conf_state |= L2CAP_CONF_MODE_DONE;
2254 break;
2255
2256 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02002257 result = L2CAP_CONF_UNACCEPT;
2258
2259 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002260 rfc.mode = pi->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02002261 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002262
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002263 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
2264 sizeof(rfc), (unsigned long) &rfc);
2265
2266 if (result == L2CAP_CONF_SUCCESS)
2267 pi->conf_state |= L2CAP_CONF_OUTPUT_DONE;
2268 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002269 rsp->scid = cpu_to_le16(pi->dcid);
2270 rsp->result = cpu_to_le16(result);
2271 rsp->flags = cpu_to_le16(0x0000);
2272
2273 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002274}
2275
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002276static int l2cap_parse_conf_rsp(struct sock *sk, void *rsp, int len, void *data, u16 *result)
2277{
2278 struct l2cap_pinfo *pi = l2cap_pi(sk);
2279 struct l2cap_conf_req *req = data;
2280 void *ptr = req->data;
2281 int type, olen;
2282 unsigned long val;
2283 struct l2cap_conf_rfc rfc;
2284
2285 BT_DBG("sk %p, rsp %p, len %d, req %p", sk, rsp, len, data);
2286
2287 while (len >= L2CAP_CONF_OPT_SIZE) {
2288 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
2289
2290 switch (type) {
2291 case L2CAP_CONF_MTU:
2292 if (val < L2CAP_DEFAULT_MIN_MTU) {
2293 *result = L2CAP_CONF_UNACCEPT;
2294 pi->omtu = L2CAP_DEFAULT_MIN_MTU;
2295 } else
2296 pi->omtu = val;
2297 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu);
2298 break;
2299
2300 case L2CAP_CONF_FLUSH_TO:
2301 pi->flush_to = val;
2302 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
2303 2, pi->flush_to);
2304 break;
2305
2306 case L2CAP_CONF_RFC:
2307 if (olen == sizeof(rfc))
2308 memcpy(&rfc, (void *)val, olen);
2309
2310 if ((pi->conf_state & L2CAP_CONF_STATE2_DEVICE) &&
2311 rfc.mode != pi->mode)
2312 return -ECONNREFUSED;
2313
2314 pi->mode = rfc.mode;
2315 pi->fcs = 0;
2316
2317 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
2318 sizeof(rfc), (unsigned long) &rfc);
2319 break;
2320 }
2321 }
2322
2323 if (*result == L2CAP_CONF_SUCCESS) {
2324 switch (rfc.mode) {
2325 case L2CAP_MODE_ERTM:
2326 pi->remote_tx_win = rfc.txwin_size;
2327 pi->retrans_timeout = rfc.retrans_timeout;
2328 pi->monitor_timeout = rfc.monitor_timeout;
2329 pi->max_pdu_size = le16_to_cpu(rfc.max_pdu_size);
2330 break;
2331 case L2CAP_MODE_STREAMING:
2332 pi->max_pdu_size = le16_to_cpu(rfc.max_pdu_size);
2333 break;
2334 }
2335 }
2336
2337 req->dcid = cpu_to_le16(pi->dcid);
2338 req->flags = cpu_to_le16(0x0000);
2339
2340 return ptr - data;
2341}
2342
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002343static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002344{
2345 struct l2cap_conf_rsp *rsp = data;
2346 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002347
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002348 BT_DBG("sk %p", sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002349
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002350 rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002351 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002352 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002353
2354 return ptr - data;
2355}
2356
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002357static inline int l2cap_command_rej(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2358{
2359 struct l2cap_cmd_rej *rej = (struct l2cap_cmd_rej *) data;
2360
2361 if (rej->reason != 0x0000)
2362 return 0;
2363
2364 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
2365 cmd->ident == conn->info_ident) {
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002366 del_timer(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01002367
2368 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002369 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01002370
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002371 l2cap_conn_start(conn);
2372 }
2373
2374 return 0;
2375}
2376
Linus Torvalds1da177e2005-04-16 15:20:36 -07002377static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2378{
2379 struct l2cap_chan_list *list = &conn->chan_list;
2380 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
2381 struct l2cap_conn_rsp rsp;
2382 struct sock *sk, *parent;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02002383 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002384
2385 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02002386 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002387
2388 BT_DBG("psm 0x%2.2x scid 0x%4.4x", psm, scid);
2389
2390 /* Check if we have socket listening on psm */
2391 parent = l2cap_get_sock_by_psm(BT_LISTEN, psm, conn->src);
2392 if (!parent) {
2393 result = L2CAP_CR_BAD_PSM;
2394 goto sendresp;
2395 }
2396
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02002397 /* Check if the ACL is secure enough (if not SDP) */
2398 if (psm != cpu_to_le16(0x0001) &&
2399 !hci_conn_check_link_mode(conn->hcon)) {
Marcel Holtmann2950f212009-02-12 14:02:50 +01002400 conn->disc_reason = 0x05;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02002401 result = L2CAP_CR_SEC_BLOCK;
2402 goto response;
2403 }
2404
Linus Torvalds1da177e2005-04-16 15:20:36 -07002405 result = L2CAP_CR_NO_MEM;
2406
2407 /* Check for backlog size */
2408 if (sk_acceptq_is_full(parent)) {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09002409 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002410 goto response;
2411 }
2412
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09002413 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002414 if (!sk)
2415 goto response;
2416
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02002417 write_lock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002418
2419 /* Check if we already have channel with that dcid */
2420 if (__l2cap_get_chan_by_dcid(list, scid)) {
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02002421 write_unlock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002422 sock_set_flag(sk, SOCK_ZAPPED);
2423 l2cap_sock_kill(sk);
2424 goto response;
2425 }
2426
2427 hci_conn_hold(conn->hcon);
2428
2429 l2cap_sock_init(sk, parent);
2430 bacpy(&bt_sk(sk)->src, conn->src);
2431 bacpy(&bt_sk(sk)->dst, conn->dst);
2432 l2cap_pi(sk)->psm = psm;
2433 l2cap_pi(sk)->dcid = scid;
2434
2435 __l2cap_chan_add(conn, sk, parent);
2436 dcid = l2cap_pi(sk)->scid;
2437
2438 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
2439
Linus Torvalds1da177e2005-04-16 15:20:36 -07002440 l2cap_pi(sk)->ident = cmd->ident;
2441
Marcel Holtmann984947d2009-02-06 23:35:19 +01002442 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002443 if (l2cap_check_security(sk)) {
Marcel Holtmannf66dc812009-01-15 21:57:00 +01002444 if (bt_sk(sk)->defer_setup) {
2445 sk->sk_state = BT_CONNECT2;
2446 result = L2CAP_CR_PEND;
2447 status = L2CAP_CS_AUTHOR_PEND;
2448 parent->sk_data_ready(parent, 0);
2449 } else {
2450 sk->sk_state = BT_CONFIG;
2451 result = L2CAP_CR_SUCCESS;
2452 status = L2CAP_CS_NO_INFO;
2453 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02002454 } else {
2455 sk->sk_state = BT_CONNECT2;
2456 result = L2CAP_CR_PEND;
2457 status = L2CAP_CS_AUTHEN_PEND;
2458 }
2459 } else {
2460 sk->sk_state = BT_CONNECT2;
2461 result = L2CAP_CR_PEND;
2462 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002463 }
2464
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02002465 write_unlock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002466
2467response:
2468 bh_unlock_sock(parent);
2469
2470sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002471 rsp.scid = cpu_to_le16(scid);
2472 rsp.dcid = cpu_to_le16(dcid);
2473 rsp.result = cpu_to_le16(result);
2474 rsp.status = cpu_to_le16(status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002475 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02002476
2477 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
2478 struct l2cap_info_req info;
2479 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
2480
2481 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
2482 conn->info_ident = l2cap_get_ident(conn);
2483
2484 mod_timer(&conn->info_timer, jiffies +
2485 msecs_to_jiffies(L2CAP_INFO_TIMEOUT));
2486
2487 l2cap_send_cmd(conn, conn->info_ident,
2488 L2CAP_INFO_REQ, sizeof(info), &info);
2489 }
2490
Linus Torvalds1da177e2005-04-16 15:20:36 -07002491 return 0;
2492}
2493
2494static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2495{
2496 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
2497 u16 scid, dcid, result, status;
2498 struct sock *sk;
2499 u8 req[128];
2500
2501 scid = __le16_to_cpu(rsp->scid);
2502 dcid = __le16_to_cpu(rsp->dcid);
2503 result = __le16_to_cpu(rsp->result);
2504 status = __le16_to_cpu(rsp->status);
2505
2506 BT_DBG("dcid 0x%4.4x scid 0x%4.4x result 0x%2.2x status 0x%2.2x", dcid, scid, result, status);
2507
2508 if (scid) {
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002509 sk = l2cap_get_chan_by_scid(&conn->chan_list, scid);
2510 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002511 return 0;
2512 } else {
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002513 sk = l2cap_get_chan_by_ident(&conn->chan_list, cmd->ident);
2514 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002515 return 0;
2516 }
2517
2518 switch (result) {
2519 case L2CAP_CR_SUCCESS:
2520 sk->sk_state = BT_CONFIG;
2521 l2cap_pi(sk)->ident = 0;
2522 l2cap_pi(sk)->dcid = dcid;
2523 l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT;
2524
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01002525 l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND;
2526
Linus Torvalds1da177e2005-04-16 15:20:36 -07002527 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
2528 l2cap_build_conf_req(sk, req), req);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002529 l2cap_pi(sk)->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002530 break;
2531
2532 case L2CAP_CR_PEND:
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01002533 l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002534 break;
2535
2536 default:
2537 l2cap_chan_del(sk, ECONNREFUSED);
2538 break;
2539 }
2540
2541 bh_unlock_sock(sk);
2542 return 0;
2543}
2544
Al Viro88219a02007-07-29 00:17:25 -07002545static 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 -07002546{
2547 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
2548 u16 dcid, flags;
2549 u8 rsp[64];
2550 struct sock *sk;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002551 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002552
2553 dcid = __le16_to_cpu(req->dcid);
2554 flags = __le16_to_cpu(req->flags);
2555
2556 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
2557
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002558 sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid);
2559 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002560 return -ENOENT;
2561
Marcel Holtmann354f60a2006-11-18 22:15:20 +01002562 if (sk->sk_state == BT_DISCONN)
2563 goto unlock;
2564
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002565 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07002566 len = cmd_len - sizeof(*req);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002567 if (l2cap_pi(sk)->conf_len + len > sizeof(l2cap_pi(sk)->conf_req)) {
2568 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
2569 l2cap_build_conf_rsp(sk, rsp,
2570 L2CAP_CONF_REJECT, flags), rsp);
2571 goto unlock;
2572 }
2573
2574 /* Store config. */
2575 memcpy(l2cap_pi(sk)->conf_req + l2cap_pi(sk)->conf_len, req->data, len);
2576 l2cap_pi(sk)->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002577
2578 if (flags & 0x0001) {
2579 /* Incomplete config. Send empty response. */
2580 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002581 l2cap_build_conf_rsp(sk, rsp,
2582 L2CAP_CONF_SUCCESS, 0x0001), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002583 goto unlock;
2584 }
2585
2586 /* Complete config. */
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002587 len = l2cap_parse_conf_req(sk, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002588 if (len < 0) {
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03002589 l2cap_send_disconn_req(conn, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002590 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002591 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002592
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002593 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002594 l2cap_pi(sk)->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002595
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002596 /* Reset config buffer. */
2597 l2cap_pi(sk)->conf_len = 0;
2598
Marcel Holtmann876d9482007-10-20 13:35:42 +02002599 if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE))
2600 goto unlock;
2601
Linus Torvalds1da177e2005-04-16 15:20:36 -07002602 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) {
2603 sk->sk_state = BT_CONNECTED;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002604 l2cap_pi(sk)->next_tx_seq = 0;
2605 l2cap_pi(sk)->expected_ack_seq = 0;
2606 l2cap_pi(sk)->unacked_frames = 0;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002607
2608 setup_timer(&l2cap_pi(sk)->retrans_timer,
2609 l2cap_retrans_timeout, (unsigned long) sk);
2610 setup_timer(&l2cap_pi(sk)->monitor_timer,
2611 l2cap_monitor_timeout, (unsigned long) sk);
2612
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002613 __skb_queue_head_init(TX_QUEUE(sk));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002614 l2cap_chan_ready(sk);
Marcel Holtmann876d9482007-10-20 13:35:42 +02002615 goto unlock;
2616 }
2617
2618 if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02002619 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002620 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Marcel Holtmann79d554a2008-07-14 20:13:44 +02002621 l2cap_build_conf_req(sk, buf), buf);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002622 l2cap_pi(sk)->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002623 }
2624
2625unlock:
2626 bh_unlock_sock(sk);
2627 return 0;
2628}
2629
2630static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2631{
2632 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
2633 u16 scid, flags, result;
2634 struct sock *sk;
2635
2636 scid = __le16_to_cpu(rsp->scid);
2637 flags = __le16_to_cpu(rsp->flags);
2638 result = __le16_to_cpu(rsp->result);
2639
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002640 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x",
2641 scid, flags, result);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002642
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002643 sk = l2cap_get_chan_by_scid(&conn->chan_list, scid);
2644 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002645 return 0;
2646
2647 switch (result) {
2648 case L2CAP_CONF_SUCCESS:
2649 break;
2650
2651 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002652 if (l2cap_pi(sk)->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
2653 int len = cmd->len - sizeof(*rsp);
2654 char req[64];
2655
2656 /* throw out any old stored conf requests */
2657 result = L2CAP_CONF_SUCCESS;
2658 len = l2cap_parse_conf_rsp(sk, rsp->data,
2659 len, req, &result);
2660 if (len < 0) {
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03002661 l2cap_send_disconn_req(conn, sk);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03002662 goto done;
2663 }
2664
2665 l2cap_send_cmd(conn, l2cap_get_ident(conn),
2666 L2CAP_CONF_REQ, len, req);
2667 l2cap_pi(sk)->num_conf_req++;
2668 if (result != L2CAP_CONF_SUCCESS)
2669 goto done;
2670 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002671 }
2672
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09002673 default:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002674 sk->sk_state = BT_DISCONN;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002675 sk->sk_err = ECONNRESET;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002676 l2cap_sock_set_timer(sk, HZ * 5);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03002677 l2cap_send_disconn_req(conn, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002678 goto done;
2679 }
2680
2681 if (flags & 0x01)
2682 goto done;
2683
Linus Torvalds1da177e2005-04-16 15:20:36 -07002684 l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE;
2685
2686 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) {
2687 sk->sk_state = BT_CONNECTED;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002688 l2cap_pi(sk)->expected_tx_seq = 0;
2689 l2cap_pi(sk)->num_to_ack = 0;
2690 __skb_queue_head_init(TX_QUEUE(sk));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002691 l2cap_chan_ready(sk);
2692 }
2693
2694done:
2695 bh_unlock_sock(sk);
2696 return 0;
2697}
2698
2699static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2700{
2701 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
2702 struct l2cap_disconn_rsp rsp;
2703 u16 dcid, scid;
2704 struct sock *sk;
2705
2706 scid = __le16_to_cpu(req->scid);
2707 dcid = __le16_to_cpu(req->dcid);
2708
2709 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
2710
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002711 sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid);
2712 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002713 return 0;
2714
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002715 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
2716 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002717 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
2718
2719 sk->sk_shutdown = SHUTDOWN_MASK;
2720
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002721 skb_queue_purge(TX_QUEUE(sk));
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002722 del_timer(&l2cap_pi(sk)->retrans_timer);
2723 del_timer(&l2cap_pi(sk)->monitor_timer);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002724
Linus Torvalds1da177e2005-04-16 15:20:36 -07002725 l2cap_chan_del(sk, ECONNRESET);
2726 bh_unlock_sock(sk);
2727
2728 l2cap_sock_kill(sk);
2729 return 0;
2730}
2731
2732static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2733{
2734 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
2735 u16 dcid, scid;
2736 struct sock *sk;
2737
2738 scid = __le16_to_cpu(rsp->scid);
2739 dcid = __le16_to_cpu(rsp->dcid);
2740
2741 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
2742
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002743 sk = l2cap_get_chan_by_scid(&conn->chan_list, scid);
2744 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002745 return 0;
2746
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002747 skb_queue_purge(TX_QUEUE(sk));
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002748 del_timer(&l2cap_pi(sk)->retrans_timer);
2749 del_timer(&l2cap_pi(sk)->monitor_timer);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002750
Linus Torvalds1da177e2005-04-16 15:20:36 -07002751 l2cap_chan_del(sk, 0);
2752 bh_unlock_sock(sk);
2753
2754 l2cap_sock_kill(sk);
2755 return 0;
2756}
2757
2758static inline int l2cap_information_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2759{
2760 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002761 u16 type;
2762
2763 type = __le16_to_cpu(req->type);
2764
2765 BT_DBG("type 0x%4.4x", type);
2766
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002767 if (type == L2CAP_IT_FEAT_MASK) {
2768 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07002769 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002770 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
2771 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
2772 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07002773 if (enable_ertm)
2774 feat_mask |= L2CAP_FEAT_ERTM;
2775 put_unaligned(cpu_to_le32(feat_mask), (__le32 *) rsp->data);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002776 l2cap_send_cmd(conn, cmd->ident,
2777 L2CAP_INFO_RSP, sizeof(buf), buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002778 } else if (type == L2CAP_IT_FIXED_CHAN) {
2779 u8 buf[12];
2780 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
2781 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
2782 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
2783 memcpy(buf + 4, l2cap_fixed_chan, 8);
2784 l2cap_send_cmd(conn, cmd->ident,
2785 L2CAP_INFO_RSP, sizeof(buf), buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002786 } else {
2787 struct l2cap_info_rsp rsp;
2788 rsp.type = cpu_to_le16(type);
2789 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
2790 l2cap_send_cmd(conn, cmd->ident,
2791 L2CAP_INFO_RSP, sizeof(rsp), &rsp);
2792 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002793
2794 return 0;
2795}
2796
2797static inline int l2cap_information_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2798{
2799 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
2800 u16 type, result;
2801
2802 type = __le16_to_cpu(rsp->type);
2803 result = __le16_to_cpu(rsp->result);
2804
2805 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
2806
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002807 del_timer(&conn->info_timer);
2808
Marcel Holtmann984947d2009-02-06 23:35:19 +01002809 if (type == L2CAP_IT_FEAT_MASK) {
Harvey Harrison83985312008-05-02 16:25:46 -07002810 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002811
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07002812 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002813 struct l2cap_info_req req;
2814 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
2815
2816 conn->info_ident = l2cap_get_ident(conn);
2817
2818 l2cap_send_cmd(conn, conn->info_ident,
2819 L2CAP_INFO_REQ, sizeof(req), &req);
2820 } else {
2821 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
2822 conn->info_ident = 0;
2823
2824 l2cap_conn_start(conn);
2825 }
2826 } else if (type == L2CAP_IT_FIXED_CHAN) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01002827 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002828 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01002829
2830 l2cap_conn_start(conn);
2831 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002832
Linus Torvalds1da177e2005-04-16 15:20:36 -07002833 return 0;
2834}
2835
2836static inline void l2cap_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb)
2837{
2838 u8 *data = skb->data;
2839 int len = skb->len;
2840 struct l2cap_cmd_hdr cmd;
2841 int err = 0;
2842
2843 l2cap_raw_recv(conn, skb);
2844
2845 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07002846 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002847 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
2848 data += L2CAP_CMD_HDR_SIZE;
2849 len -= L2CAP_CMD_HDR_SIZE;
2850
Al Viro88219a02007-07-29 00:17:25 -07002851 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002852
Al Viro88219a02007-07-29 00:17:25 -07002853 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 -07002854
Al Viro88219a02007-07-29 00:17:25 -07002855 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002856 BT_DBG("corrupted command");
2857 break;
2858 }
2859
2860 switch (cmd.code) {
2861 case L2CAP_COMMAND_REJ:
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002862 l2cap_command_rej(conn, &cmd, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002863 break;
2864
2865 case L2CAP_CONN_REQ:
2866 err = l2cap_connect_req(conn, &cmd, data);
2867 break;
2868
2869 case L2CAP_CONN_RSP:
2870 err = l2cap_connect_rsp(conn, &cmd, data);
2871 break;
2872
2873 case L2CAP_CONF_REQ:
Al Viro88219a02007-07-29 00:17:25 -07002874 err = l2cap_config_req(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875 break;
2876
2877 case L2CAP_CONF_RSP:
2878 err = l2cap_config_rsp(conn, &cmd, data);
2879 break;
2880
2881 case L2CAP_DISCONN_REQ:
2882 err = l2cap_disconnect_req(conn, &cmd, data);
2883 break;
2884
2885 case L2CAP_DISCONN_RSP:
2886 err = l2cap_disconnect_rsp(conn, &cmd, data);
2887 break;
2888
2889 case L2CAP_ECHO_REQ:
Al Viro88219a02007-07-29 00:17:25 -07002890 l2cap_send_cmd(conn, cmd.ident, L2CAP_ECHO_RSP, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002891 break;
2892
2893 case L2CAP_ECHO_RSP:
2894 break;
2895
2896 case L2CAP_INFO_REQ:
2897 err = l2cap_information_req(conn, &cmd, data);
2898 break;
2899
2900 case L2CAP_INFO_RSP:
2901 err = l2cap_information_rsp(conn, &cmd, data);
2902 break;
2903
2904 default:
2905 BT_ERR("Unknown signaling command 0x%2.2x", cmd.code);
2906 err = -EINVAL;
2907 break;
2908 }
2909
2910 if (err) {
2911 struct l2cap_cmd_rej rej;
2912 BT_DBG("error %d", err);
2913
2914 /* FIXME: Map err to a valid reason */
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002915 rej.reason = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
2917 }
2918
Al Viro88219a02007-07-29 00:17:25 -07002919 data += cmd_len;
2920 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002921 }
2922
2923 kfree_skb(skb);
2924}
2925
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002926static int l2cap_sar_reassembly_sdu(struct sock *sk, struct sk_buff *skb, u16 control)
2927{
2928 struct l2cap_pinfo *pi = l2cap_pi(sk);
2929 struct sk_buff *_skb;
2930 int err = -EINVAL;
2931
2932 switch (control & L2CAP_CTRL_SAR) {
2933 case L2CAP_SDU_UNSEGMENTED:
2934 if (pi->conn_state & L2CAP_CONN_SAR_SDU) {
2935 kfree_skb(pi->sdu);
2936 break;
2937 }
2938
2939 err = sock_queue_rcv_skb(sk, skb);
2940 if (!err)
2941 return 0;
2942
2943 break;
2944
2945 case L2CAP_SDU_START:
2946 if (pi->conn_state & L2CAP_CONN_SAR_SDU) {
2947 kfree_skb(pi->sdu);
2948 break;
2949 }
2950
2951 pi->sdu_len = get_unaligned_le16(skb->data);
2952 skb_pull(skb, 2);
2953
2954 pi->sdu = bt_skb_alloc(pi->sdu_len, GFP_ATOMIC);
2955 if (!pi->sdu) {
2956 err = -ENOMEM;
2957 break;
2958 }
2959
2960 memcpy(skb_put(pi->sdu, skb->len), skb->data, skb->len);
2961
2962 pi->conn_state |= L2CAP_CONN_SAR_SDU;
2963 pi->partial_sdu_len = skb->len;
2964 err = 0;
2965 break;
2966
2967 case L2CAP_SDU_CONTINUE:
2968 if (!(pi->conn_state & L2CAP_CONN_SAR_SDU))
2969 break;
2970
2971 memcpy(skb_put(pi->sdu, skb->len), skb->data, skb->len);
2972
2973 pi->partial_sdu_len += skb->len;
2974 if (pi->partial_sdu_len > pi->sdu_len)
2975 kfree_skb(pi->sdu);
2976 else
2977 err = 0;
2978
2979 break;
2980
2981 case L2CAP_SDU_END:
2982 if (!(pi->conn_state & L2CAP_CONN_SAR_SDU))
2983 break;
2984
2985 memcpy(skb_put(pi->sdu, skb->len), skb->data, skb->len);
2986
2987 pi->conn_state &= ~L2CAP_CONN_SAR_SDU;
2988 pi->partial_sdu_len += skb->len;
2989
2990 if (pi->partial_sdu_len == pi->sdu_len) {
2991 _skb = skb_clone(pi->sdu, GFP_ATOMIC);
2992 err = sock_queue_rcv_skb(sk, _skb);
2993 if (err < 0)
2994 kfree_skb(_skb);
2995 }
2996 kfree_skb(pi->sdu);
2997 err = 0;
2998
2999 break;
3000 }
3001
3002 kfree_skb(skb);
3003 return err;
3004}
3005
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003006static inline int l2cap_data_channel_iframe(struct sock *sk, u16 rx_control, struct sk_buff *skb)
3007{
3008 struct l2cap_pinfo *pi = l2cap_pi(sk);
3009 u8 tx_seq = __get_txseq(rx_control);
3010 u16 tx_control = 0;
3011 int err = 0;
3012
3013 BT_DBG("sk %p rx_control 0x%4.4x len %d", sk, rx_control, skb->len);
3014
Gustavo F. Padovan30afb5b2009-08-20 22:25:59 -03003015 if (tx_seq == pi->expected_tx_seq) {
3016 if (pi->conn_state & L2CAP_CONN_UNDER_REJ)
3017 pi->conn_state &= ~L2CAP_CONN_UNDER_REJ;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003018
Gustavo F. Padovan30afb5b2009-08-20 22:25:59 -03003019 err = l2cap_sar_reassembly_sdu(sk, skb, rx_control);
3020 if (err < 0)
3021 return err;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003022
Gustavo F. Padovan30afb5b2009-08-20 22:25:59 -03003023 pi->expected_tx_seq = (pi->expected_tx_seq + 1) % 64;
3024 pi->num_to_ack = (pi->num_to_ack + 1) % L2CAP_DEFAULT_NUM_TO_ACK;
3025 if (pi->num_to_ack == L2CAP_DEFAULT_NUM_TO_ACK - 1) {
3026 tx_control |= L2CAP_SUPER_RCV_READY;
3027 tx_control |= pi->expected_tx_seq << L2CAP_CTRL_REQSEQ_SHIFT;
3028 goto send;
3029 }
3030 } else {
3031 /* Unexpected txSeq. Send a REJ S-frame */
3032 kfree_skb(skb);
3033 if (!(pi->conn_state & L2CAP_CONN_UNDER_REJ)) {
3034 tx_control |= L2CAP_SUPER_REJECT;
3035 tx_control |= pi->expected_tx_seq << L2CAP_CTRL_REQSEQ_SHIFT;
3036 pi->conn_state |= L2CAP_CONN_UNDER_REJ;
3037
3038 goto send;
3039 }
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003040 }
Gustavo F. Padovan30afb5b2009-08-20 22:25:59 -03003041 return 0;
3042
3043send:
3044 return l2cap_send_sframe(pi, tx_control);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003045}
3046
3047static inline int l2cap_data_channel_sframe(struct sock *sk, u16 rx_control, struct sk_buff *skb)
3048{
3049 struct l2cap_pinfo *pi = l2cap_pi(sk);
3050
3051 BT_DBG("sk %p rx_control 0x%4.4x len %d", sk, rx_control, skb->len);
3052
3053 switch (rx_control & L2CAP_CTRL_SUPERVISE) {
3054 case L2CAP_SUPER_RCV_READY:
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03003055 if (rx_control & L2CAP_CTRL_POLL) {
3056 u16 control = L2CAP_CTRL_FINAL;
3057 control |= L2CAP_SUPER_RCV_READY;
3058 l2cap_send_sframe(l2cap_pi(sk), control);
3059 } else if (rx_control & L2CAP_CTRL_FINAL) {
3060 if (!(pi->conn_state & L2CAP_CONN_WAIT_F))
3061 break;
3062
3063 pi->conn_state &= ~L2CAP_CONN_WAIT_F;
3064 del_timer(&pi->monitor_timer);
3065
3066 if (pi->unacked_frames > 0)
3067 __mod_retrans_timer();
3068 } else {
3069 pi->expected_ack_seq = __get_reqseq(rx_control);
3070 l2cap_drop_acked_frames(sk);
3071 if (pi->unacked_frames > 0)
3072 __mod_retrans_timer();
3073 l2cap_ertm_send(sk);
3074 }
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003075 break;
3076
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003077 case L2CAP_SUPER_REJECT:
Gustavo F. Padovan30afb5b2009-08-20 22:25:59 -03003078 pi->expected_ack_seq = __get_reqseq(rx_control);
3079 l2cap_drop_acked_frames(sk);
3080
3081 sk->sk_send_head = TX_QUEUE(sk)->next;
3082 pi->next_tx_seq = pi->expected_ack_seq;
3083
3084 l2cap_ertm_send(sk);
3085
3086 break;
3087
3088 case L2CAP_SUPER_RCV_NOT_READY:
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003089 case L2CAP_SUPER_SELECT_REJECT:
3090 break;
3091 }
3092
3093 return 0;
3094}
3095
Linus Torvalds1da177e2005-04-16 15:20:36 -07003096static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk_buff *skb)
3097{
3098 struct sock *sk;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03003099 u16 control, len;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003100 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003101
3102 sk = l2cap_get_chan_by_scid(&conn->chan_list, cid);
3103 if (!sk) {
3104 BT_DBG("unknown cid 0x%4.4x", cid);
3105 goto drop;
3106 }
3107
3108 BT_DBG("sk %p, len %d", sk, skb->len);
3109
3110 if (sk->sk_state != BT_CONNECTED)
3111 goto drop;
3112
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003113 switch (l2cap_pi(sk)->mode) {
3114 case L2CAP_MODE_BASIC:
3115 /* If socket recv buffers overflows we drop data here
3116 * which is *bad* because L2CAP has to be reliable.
3117 * But we don't have any other choice. L2CAP doesn't
3118 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003119
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003120 if (l2cap_pi(sk)->imtu < skb->len)
3121 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003122
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003123 if (!sock_queue_rcv_skb(sk, skb))
3124 goto done;
3125 break;
3126
3127 case L2CAP_MODE_ERTM:
3128 control = get_unaligned_le16(skb->data);
3129 skb_pull(skb, 2);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03003130 len = skb->len;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003131
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03003132 if (__is_sar_start(control))
3133 len -= 2;
3134
Gustavo F. Padovan30afb5b2009-08-20 22:25:59 -03003135 /*
3136 * We can just drop the corrupted I-frame here.
3137 * Receiver will miss it and start proper recovery
3138 * procedures and ask retransmission.
3139 */
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03003140 if (len > L2CAP_DEFAULT_MAX_PDU_SIZE)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003141 goto drop;
3142
3143 if (__is_iframe(control))
3144 err = l2cap_data_channel_iframe(sk, control, skb);
3145 else
3146 err = l2cap_data_channel_sframe(sk, control, skb);
3147
3148 if (!err)
3149 goto done;
3150 break;
3151
3152 default:
3153 BT_DBG("sk %p: bad mode 0x%2.2x", sk, l2cap_pi(sk)->mode);
3154 break;
3155 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003156
3157drop:
3158 kfree_skb(skb);
3159
3160done:
Marcel Holtmann01394182006-07-03 10:02:46 +02003161 if (sk)
3162 bh_unlock_sock(sk);
3163
Linus Torvalds1da177e2005-04-16 15:20:36 -07003164 return 0;
3165}
3166
Al Viro8e036fc2007-07-29 00:16:36 -07003167static inline int l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003168{
3169 struct sock *sk;
3170
3171 sk = l2cap_get_sock_by_psm(0, psm, conn->src);
3172 if (!sk)
3173 goto drop;
3174
3175 BT_DBG("sk %p, len %d", sk, skb->len);
3176
3177 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_CONNECTED)
3178 goto drop;
3179
3180 if (l2cap_pi(sk)->imtu < skb->len)
3181 goto drop;
3182
3183 if (!sock_queue_rcv_skb(sk, skb))
3184 goto done;
3185
3186drop:
3187 kfree_skb(skb);
3188
3189done:
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03003190 if (sk)
3191 bh_unlock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003192 return 0;
3193}
3194
3195static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
3196{
3197 struct l2cap_hdr *lh = (void *) skb->data;
Al Viro8e036fc2007-07-29 00:16:36 -07003198 u16 cid, len;
3199 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003200
3201 skb_pull(skb, L2CAP_HDR_SIZE);
3202 cid = __le16_to_cpu(lh->cid);
3203 len = __le16_to_cpu(lh->len);
3204
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03003205 if (len != skb->len) {
3206 kfree_skb(skb);
3207 return;
3208 }
3209
Linus Torvalds1da177e2005-04-16 15:20:36 -07003210 BT_DBG("len %d, cid 0x%4.4x", len, cid);
3211
3212 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03003213 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003214 l2cap_sig_channel(conn, skb);
3215 break;
3216
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03003217 case L2CAP_CID_CONN_LESS:
Al Viro8e036fc2007-07-29 00:16:36 -07003218 psm = get_unaligned((__le16 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003219 skb_pull(skb, 2);
3220 l2cap_conless_channel(conn, psm, skb);
3221 break;
3222
3223 default:
3224 l2cap_data_channel(conn, cid, skb);
3225 break;
3226 }
3227}
3228
3229/* ---- L2CAP interface with lower layer (HCI) ---- */
3230
3231static int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3232{
3233 int exact = 0, lm1 = 0, lm2 = 0;
3234 register struct sock *sk;
3235 struct hlist_node *node;
3236
3237 if (type != ACL_LINK)
3238 return 0;
3239
3240 BT_DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr));
3241
3242 /* Find listening sockets and check their link_mode */
3243 read_lock(&l2cap_sk_list.lock);
3244 sk_for_each(sk, node, &l2cap_sk_list.head) {
3245 if (sk->sk_state != BT_LISTEN)
3246 continue;
3247
3248 if (!bacmp(&bt_sk(sk)->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01003249 lm1 |= HCI_LM_ACCEPT;
3250 if (l2cap_pi(sk)->role_switch)
3251 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003252 exact++;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01003253 } else if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) {
3254 lm2 |= HCI_LM_ACCEPT;
3255 if (l2cap_pi(sk)->role_switch)
3256 lm2 |= HCI_LM_MASTER;
3257 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003258 }
3259 read_unlock(&l2cap_sk_list.lock);
3260
3261 return exact ? lm1 : lm2;
3262}
3263
3264static int l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
3265{
Marcel Holtmann01394182006-07-03 10:02:46 +02003266 struct l2cap_conn *conn;
3267
Linus Torvalds1da177e2005-04-16 15:20:36 -07003268 BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status);
3269
3270 if (hcon->type != ACL_LINK)
3271 return 0;
3272
3273 if (!status) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003274 conn = l2cap_conn_add(hcon, status);
3275 if (conn)
3276 l2cap_conn_ready(conn);
Marcel Holtmann01394182006-07-03 10:02:46 +02003277 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003278 l2cap_conn_del(hcon, bt_err(status));
3279
3280 return 0;
3281}
3282
Marcel Holtmann2950f212009-02-12 14:02:50 +01003283static int l2cap_disconn_ind(struct hci_conn *hcon)
3284{
3285 struct l2cap_conn *conn = hcon->l2cap_data;
3286
3287 BT_DBG("hcon %p", hcon);
3288
3289 if (hcon->type != ACL_LINK || !conn)
3290 return 0x13;
3291
3292 return conn->disc_reason;
3293}
3294
3295static int l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003296{
3297 BT_DBG("hcon %p reason %d", hcon, reason);
3298
3299 if (hcon->type != ACL_LINK)
3300 return 0;
3301
3302 l2cap_conn_del(hcon, bt_err(reason));
Marcel Holtmann01394182006-07-03 10:02:46 +02003303
Linus Torvalds1da177e2005-04-16 15:20:36 -07003304 return 0;
3305}
3306
Marcel Holtmannf62e4322009-01-15 21:58:44 +01003307static inline void l2cap_check_encryption(struct sock *sk, u8 encrypt)
3308{
Marcel Holtmann255c7602009-02-04 21:07:19 +01003309 if (sk->sk_type != SOCK_SEQPACKET)
3310 return;
3311
Marcel Holtmannf62e4322009-01-15 21:58:44 +01003312 if (encrypt == 0x00) {
3313 if (l2cap_pi(sk)->sec_level == BT_SECURITY_MEDIUM) {
3314 l2cap_sock_clear_timer(sk);
3315 l2cap_sock_set_timer(sk, HZ * 5);
3316 } else if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH)
3317 __l2cap_sock_close(sk, ECONNREFUSED);
3318 } else {
3319 if (l2cap_pi(sk)->sec_level == BT_SECURITY_MEDIUM)
3320 l2cap_sock_clear_timer(sk);
3321 }
3322}
3323
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01003324static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003325{
3326 struct l2cap_chan_list *l;
Marcel Holtmann40be4922008-07-14 20:13:50 +02003327 struct l2cap_conn *conn = hcon->l2cap_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003328 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003329
Marcel Holtmann01394182006-07-03 10:02:46 +02003330 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003331 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02003332
Linus Torvalds1da177e2005-04-16 15:20:36 -07003333 l = &conn->chan_list;
3334
3335 BT_DBG("conn %p", conn);
3336
3337 read_lock(&l->lock);
3338
3339 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
3340 bh_lock_sock(sk);
3341
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003342 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND) {
3343 bh_unlock_sock(sk);
3344 continue;
3345 }
3346
Marcel Holtmannf62e4322009-01-15 21:58:44 +01003347 if (!status && (sk->sk_state == BT_CONNECTED ||
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01003348 sk->sk_state == BT_CONFIG)) {
Marcel Holtmannf62e4322009-01-15 21:58:44 +01003349 l2cap_check_encryption(sk, encrypt);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02003350 bh_unlock_sock(sk);
3351 continue;
3352 }
3353
Marcel Holtmannb1235d72008-07-14 20:13:54 +02003354 if (sk->sk_state == BT_CONNECT) {
3355 if (!status) {
3356 struct l2cap_conn_req req;
3357 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
3358 req.psm = l2cap_pi(sk)->psm;
3359
3360 l2cap_pi(sk)->ident = l2cap_get_ident(conn);
3361
3362 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
3363 L2CAP_CONN_REQ, sizeof(req), &req);
3364 } else {
3365 l2cap_sock_clear_timer(sk);
3366 l2cap_sock_set_timer(sk, HZ / 10);
3367 }
3368 } else if (sk->sk_state == BT_CONNECT2) {
3369 struct l2cap_conn_rsp rsp;
3370 __u16 result;
3371
3372 if (!status) {
3373 sk->sk_state = BT_CONFIG;
3374 result = L2CAP_CR_SUCCESS;
3375 } else {
3376 sk->sk_state = BT_DISCONN;
3377 l2cap_sock_set_timer(sk, HZ / 10);
3378 result = L2CAP_CR_SEC_BLOCK;
3379 }
3380
3381 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
3382 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
3383 rsp.result = cpu_to_le16(result);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003384 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02003385 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
3386 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003387 }
3388
Linus Torvalds1da177e2005-04-16 15:20:36 -07003389 bh_unlock_sock(sk);
3390 }
3391
3392 read_unlock(&l->lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02003393
Linus Torvalds1da177e2005-04-16 15:20:36 -07003394 return 0;
3395}
3396
3397static int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
3398{
3399 struct l2cap_conn *conn = hcon->l2cap_data;
3400
3401 if (!conn && !(conn = l2cap_conn_add(hcon, 0)))
3402 goto drop;
3403
3404 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
3405
3406 if (flags & ACL_START) {
3407 struct l2cap_hdr *hdr;
3408 int len;
3409
3410 if (conn->rx_len) {
3411 BT_ERR("Unexpected start frame (len %d)", skb->len);
3412 kfree_skb(conn->rx_skb);
3413 conn->rx_skb = NULL;
3414 conn->rx_len = 0;
3415 l2cap_conn_unreliable(conn, ECOMM);
3416 }
3417
3418 if (skb->len < 2) {
3419 BT_ERR("Frame is too short (len %d)", skb->len);
3420 l2cap_conn_unreliable(conn, ECOMM);
3421 goto drop;
3422 }
3423
3424 hdr = (struct l2cap_hdr *) skb->data;
3425 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
3426
3427 if (len == skb->len) {
3428 /* Complete frame received */
3429 l2cap_recv_frame(conn, skb);
3430 return 0;
3431 }
3432
3433 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
3434
3435 if (skb->len > len) {
3436 BT_ERR("Frame is too long (len %d, expected len %d)",
3437 skb->len, len);
3438 l2cap_conn_unreliable(conn, ECOMM);
3439 goto drop;
3440 }
3441
3442 /* Allocate skb for the complete frame (with header) */
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03003443 conn->rx_skb = bt_skb_alloc(len, GFP_ATOMIC);
3444 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003445 goto drop;
3446
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03003447 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003448 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003449 conn->rx_len = len - skb->len;
3450 } else {
3451 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
3452
3453 if (!conn->rx_len) {
3454 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
3455 l2cap_conn_unreliable(conn, ECOMM);
3456 goto drop;
3457 }
3458
3459 if (skb->len > conn->rx_len) {
3460 BT_ERR("Fragment is too long (len %d, expected %d)",
3461 skb->len, conn->rx_len);
3462 kfree_skb(conn->rx_skb);
3463 conn->rx_skb = NULL;
3464 conn->rx_len = 0;
3465 l2cap_conn_unreliable(conn, ECOMM);
3466 goto drop;
3467 }
3468
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03003469 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003470 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003471 conn->rx_len -= skb->len;
3472
3473 if (!conn->rx_len) {
3474 /* Complete frame received */
3475 l2cap_recv_frame(conn, conn->rx_skb);
3476 conn->rx_skb = NULL;
3477 }
3478 }
3479
3480drop:
3481 kfree_skb(skb);
3482 return 0;
3483}
3484
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08003485static ssize_t l2cap_sysfs_show(struct class *dev, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003486{
3487 struct sock *sk;
3488 struct hlist_node *node;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08003489 char *str = buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003490
3491 read_lock_bh(&l2cap_sk_list.lock);
3492
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08003493 sk_for_each(sk, node, &l2cap_sk_list.head) {
3494 struct l2cap_pinfo *pi = l2cap_pi(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003495
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01003496 str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n",
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08003497 batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
Marcel Holtmannb4324b52009-06-07 18:06:51 +02003498 sk->sk_state, __le16_to_cpu(pi->psm), pi->scid,
3499 pi->dcid, pi->imtu, pi->omtu, pi->sec_level);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08003500 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003501
Linus Torvalds1da177e2005-04-16 15:20:36 -07003502 read_unlock_bh(&l2cap_sk_list.lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08003503
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03003504 return str - buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003505}
3506
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08003507static CLASS_ATTR(l2cap, S_IRUGO, l2cap_sysfs_show, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003508
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08003509static const struct proto_ops l2cap_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003510 .family = PF_BLUETOOTH,
3511 .owner = THIS_MODULE,
3512 .release = l2cap_sock_release,
3513 .bind = l2cap_sock_bind,
3514 .connect = l2cap_sock_connect,
3515 .listen = l2cap_sock_listen,
3516 .accept = l2cap_sock_accept,
3517 .getname = l2cap_sock_getname,
3518 .sendmsg = l2cap_sock_sendmsg,
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003519 .recvmsg = l2cap_sock_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003520 .poll = bt_sock_poll,
Marcel Holtmann3241ad82008-07-14 20:13:50 +02003521 .ioctl = bt_sock_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003522 .mmap = sock_no_mmap,
3523 .socketpair = sock_no_socketpair,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003524 .shutdown = l2cap_sock_shutdown,
3525 .setsockopt = l2cap_sock_setsockopt,
3526 .getsockopt = l2cap_sock_getsockopt
3527};
3528
3529static struct net_proto_family l2cap_sock_family_ops = {
3530 .family = PF_BLUETOOTH,
3531 .owner = THIS_MODULE,
3532 .create = l2cap_sock_create,
3533};
3534
3535static struct hci_proto l2cap_hci_proto = {
3536 .name = "L2CAP",
3537 .id = HCI_PROTO_L2CAP,
3538 .connect_ind = l2cap_connect_ind,
3539 .connect_cfm = l2cap_connect_cfm,
3540 .disconn_ind = l2cap_disconn_ind,
Marcel Holtmann2950f212009-02-12 14:02:50 +01003541 .disconn_cfm = l2cap_disconn_cfm,
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01003542 .security_cfm = l2cap_security_cfm,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003543 .recv_acldata = l2cap_recv_acldata
3544};
3545
3546static int __init l2cap_init(void)
3547{
3548 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08003549
Linus Torvalds1da177e2005-04-16 15:20:36 -07003550 err = proto_register(&l2cap_proto, 0);
3551 if (err < 0)
3552 return err;
3553
3554 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
3555 if (err < 0) {
3556 BT_ERR("L2CAP socket registration failed");
3557 goto error;
3558 }
3559
3560 err = hci_register_proto(&l2cap_hci_proto);
3561 if (err < 0) {
3562 BT_ERR("L2CAP protocol registration failed");
3563 bt_sock_unregister(BTPROTO_L2CAP);
3564 goto error;
3565 }
3566
Marcel Holtmanndf5c37e2006-10-15 17:30:45 +02003567 if (class_create_file(bt_class, &class_attr_l2cap) < 0)
3568 BT_ERR("Failed to create L2CAP info file");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003569
3570 BT_INFO("L2CAP ver %s", VERSION);
3571 BT_INFO("L2CAP socket layer initialized");
3572
3573 return 0;
3574
3575error:
3576 proto_unregister(&l2cap_proto);
3577 return err;
3578}
3579
3580static void __exit l2cap_exit(void)
3581{
Marcel Holtmanna91f2e32006-07-03 10:02:41 +02003582 class_remove_file(bt_class, &class_attr_l2cap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003583
3584 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
3585 BT_ERR("L2CAP socket unregistration failed");
3586
3587 if (hci_unregister_proto(&l2cap_hci_proto) < 0)
3588 BT_ERR("L2CAP protocol unregistration failed");
3589
3590 proto_unregister(&l2cap_proto);
3591}
3592
3593void l2cap_load(void)
3594{
3595 /* Dummy function to trigger automatic L2CAP module loading by
3596 * other modules that use L2CAP sockets but don't use any other
3597 * symbols from it. */
3598 return;
3599}
3600EXPORT_SYMBOL(l2cap_load);
3601
3602module_init(l2cap_init);
3603module_exit(l2cap_exit);
3604
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07003605module_param(enable_ertm, bool, 0644);
3606MODULE_PARM_DESC(enable_ertm, "Enable enhanced retransmission mode");
3607
Marcel Holtmann63fbd242008-08-18 13:23:53 +02003608MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003609MODULE_DESCRIPTION("Bluetooth L2CAP ver " VERSION);
3610MODULE_VERSION(VERSION);
3611MODULE_LICENSE("GPL");
3612MODULE_ALIAS("bt-proto-0");