l2cap_core.c 107.8 KB
Newer Older
1
/*
L
Linus Torvalds 已提交
2 3
   BlueZ - Bluetooth protocol stack for Linux
   Copyright (C) 2000-2001 Qualcomm Incorporated
4
   Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
5
   Copyright (C) 2010 Google Inc.
6
   Copyright (C) 2011 ProFUSION Embedded Systems
L
Linus Torvalds 已提交
7 8 9 10 11 12 13 14 15 16 17

   Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License version 2 as
   published by the Free Software Foundation;

   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
18 19 20
   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
L
Linus Torvalds 已提交
21 22
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

23 24
   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
L
Linus Torvalds 已提交
25 26 27
   SOFTWARE IS DISCLAIMED.
*/

28
/* Bluetooth L2CAP core. */
L
Linus Torvalds 已提交
29 30 31 32

#include <linux/module.h>

#include <linux/types.h>
33
#include <linux/capability.h>
L
Linus Torvalds 已提交
34 35 36 37 38 39 40 41 42 43 44
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/poll.h>
#include <linux/fcntl.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/socket.h>
#include <linux/skbuff.h>
#include <linux/list.h>
45
#include <linux/device.h>
46 47
#include <linux/debugfs.h>
#include <linux/seq_file.h>
48
#include <linux/uaccess.h>
49
#include <linux/crc16.h>
L
Linus Torvalds 已提交
50 51 52 53 54 55 56
#include <net/sock.h>

#include <asm/unaligned.h>

#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
#include <net/bluetooth/l2cap.h>
57
#include <net/bluetooth/smp.h>
L
Linus Torvalds 已提交
58

59
bool disable_ertm;
60

61
static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN;
62
static u8 l2cap_fixed_chan[8] = { L2CAP_FC_L2CAP, };
L
Linus Torvalds 已提交
63

64 65
static LIST_HEAD(chan_list);
static DEFINE_RWLOCK(chan_list_lock);
L
Linus Torvalds 已提交
66 67 68

static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
				u8 code, u8 ident, u16 dlen, void *data);
69 70
static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
								void *data);
71
static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
72 73
static void l2cap_send_disconn_req(struct l2cap_conn *conn,
				struct l2cap_chan *chan, int err);
L
Linus Torvalds 已提交
74

75
/* ---- L2CAP channels ---- */
76

77
static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn, u16 cid)
78
{
79
	struct l2cap_chan *c;
80

81 82 83
	list_for_each_entry(c, &conn->chan_l, list) {
		if (c->dcid == cid)
			return c;
84
	}
85
	return NULL;
86 87
}

88
static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn, u16 cid)
89
{
90
	struct l2cap_chan *c;
91

92 93 94
	list_for_each_entry(c, &conn->chan_l, list) {
		if (c->scid == cid)
			return c;
95
	}
96
	return NULL;
97 98 99 100
}

/* Find channel with given SCID.
 * Returns locked socket */
101
static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn, u16 cid)
102
{
103
	struct l2cap_chan *c;
104

105
	mutex_lock(&conn->chan_lock);
106
	c = __l2cap_get_chan_by_scid(conn, cid);
107 108
	mutex_unlock(&conn->chan_lock);

109
	return c;
110 111
}

112
static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn, u8 ident)
113
{
114
	struct l2cap_chan *c;
115

116 117 118
	list_for_each_entry(c, &conn->chan_l, list) {
		if (c->ident == ident)
			return c;
119
	}
120
	return NULL;
121 122
}

123
static inline struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn, u8 ident)
124
{
125
	struct l2cap_chan *c;
126

127
	mutex_lock(&conn->chan_lock);
128
	c = __l2cap_get_chan_by_ident(conn, ident);
129 130
	mutex_unlock(&conn->chan_lock);

131
	return c;
132 133
}

134
static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
135
{
136
	struct l2cap_chan *c;
137

138 139
	list_for_each_entry(c, &chan_list, global_l) {
		if (c->sport == psm && !bacmp(&bt_sk(c->sk)->src, src))
140
			return c;
141
	}
142
	return NULL;
143 144 145 146
}

int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
{
147 148
	int err;

149
	write_lock(&chan_list_lock);
150

151
	if (psm && __l2cap_global_chan_by_addr(psm, src)) {
152 153
		err = -EADDRINUSE;
		goto done;
154 155
	}

156 157 158 159 160 161 162 163 164
	if (psm) {
		chan->psm = psm;
		chan->sport = psm;
		err = 0;
	} else {
		u16 p;

		err = -EINVAL;
		for (p = 0x1001; p < 0x1100; p += 2)
165
			if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
166 167 168 169 170 171
				chan->psm   = cpu_to_le16(p);
				chan->sport = cpu_to_le16(p);
				err = 0;
				break;
			}
	}
172

173
done:
174
	write_unlock(&chan_list_lock);
175
	return err;
176 177 178 179
}

int l2cap_add_scid(struct l2cap_chan *chan,  __u16 scid)
{
180
	write_lock(&chan_list_lock);
181 182 183

	chan->scid = scid;

184
	write_unlock(&chan_list_lock);
185 186 187 188

	return 0;
}

189
static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
190
{
191
	u16 cid = L2CAP_CID_DYN_START;
192

193
	for (; cid < L2CAP_CID_DYN_END; cid++) {
194
		if (!__l2cap_get_chan_by_scid(conn, cid))
195 196 197 198 199 200
			return cid;
	}

	return 0;
}

201
static void __l2cap_state_change(struct l2cap_chan *chan, int state)
202
{
203
	BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
204 205
						state_to_string(state));

206 207 208 209
	chan->state = state;
	chan->ops->state_change(chan->data, state);
}

210 211 212 213 214 215 216 217 218
static void l2cap_state_change(struct l2cap_chan *chan, int state)
{
	struct sock *sk = chan->sk;

	lock_sock(sk);
	__l2cap_state_change(chan, state);
	release_sock(sk);
}

219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
static inline void __l2cap_chan_set_err(struct l2cap_chan *chan, int err)
{
	struct sock *sk = chan->sk;

	sk->sk_err = err;
}

static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
{
	struct sock *sk = chan->sk;

	lock_sock(sk);
	__l2cap_chan_set_err(chan, err);
	release_sock(sk);
}

235
static void l2cap_chan_timeout(struct work_struct *work)
236
{
237 238
	struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
							chan_timer.work);
239
	struct l2cap_conn *conn = chan->conn;
240 241
	int reason;

242
	BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
243

244
	mutex_lock(&conn->chan_lock);
245
	l2cap_chan_lock(chan);
246

247
	if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
248
		reason = ECONNREFUSED;
249
	else if (chan->state == BT_CONNECT &&
250 251 252 253 254
					chan->sec_level != BT_SECURITY_SDP)
		reason = ECONNREFUSED;
	else
		reason = ETIMEDOUT;

255
	l2cap_chan_close(chan, reason);
256

257
	l2cap_chan_unlock(chan);
258

259
	chan->ops->close(chan->data);
260 261
	mutex_unlock(&conn->chan_lock);

262
	l2cap_chan_put(chan);
263 264
}

265
struct l2cap_chan *l2cap_chan_create(struct sock *sk)
266 267 268 269 270 271 272
{
	struct l2cap_chan *chan;

	chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
	if (!chan)
		return NULL;

273 274
	mutex_init(&chan->lock);

275 276
	chan->sk = sk;

277
	write_lock(&chan_list_lock);
278
	list_add(&chan->global_l, &chan_list);
279
	write_unlock(&chan_list_lock);
280

281
	INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
282

283 284
	chan->state = BT_OPEN;

285 286
	atomic_set(&chan->refcnt, 1);

287 288
	BT_DBG("sk %p chan %p", sk, chan);

289 290 291
	return chan;
}

292
void l2cap_chan_destroy(struct l2cap_chan *chan)
293
{
294
	write_lock(&chan_list_lock);
295
	list_del(&chan->global_l);
296
	write_unlock(&chan_list_lock);
297

298
	l2cap_chan_put(chan);
299 300
}

301
static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
302
{
303
	BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
304
	       __le16_to_cpu(chan->psm), chan->dcid);
305

306
	conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
307

308
	chan->conn = conn;
309

310 311
	switch (chan->chan_type) {
	case L2CAP_CHAN_CONN_ORIENTED:
312 313
		if (conn->hcon->type == LE_LINK) {
			/* LE connection */
314
			chan->omtu = L2CAP_LE_DEFAULT_MTU;
315 316
			chan->scid = L2CAP_CID_LE_DATA;
			chan->dcid = L2CAP_CID_LE_DATA;
317 318
		} else {
			/* Alloc CID for connection-oriented socket */
319
			chan->scid = l2cap_alloc_cid(conn);
320
			chan->omtu = L2CAP_DEFAULT_MTU;
321
		}
322 323 324
		break;

	case L2CAP_CHAN_CONN_LESS:
325
		/* Connectionless socket */
326 327
		chan->scid = L2CAP_CID_CONN_LESS;
		chan->dcid = L2CAP_CID_CONN_LESS;
328
		chan->omtu = L2CAP_DEFAULT_MTU;
329 330 331
		break;

	default:
332
		/* Raw socket can send/recv signalling messages only */
333 334
		chan->scid = L2CAP_CID_SIGNALING;
		chan->dcid = L2CAP_CID_SIGNALING;
335
		chan->omtu = L2CAP_DEFAULT_MTU;
336 337
	}

338 339 340 341 342 343 344
	chan->local_id		= L2CAP_BESTEFFORT_ID;
	chan->local_stype	= L2CAP_SERV_BESTEFFORT;
	chan->local_msdu	= L2CAP_DEFAULT_MAX_SDU_SIZE;
	chan->local_sdu_itime	= L2CAP_DEFAULT_SDU_ITIME;
	chan->local_acc_lat	= L2CAP_DEFAULT_ACC_LAT;
	chan->local_flush_to	= L2CAP_DEFAULT_FLUSH_TO;

345
	l2cap_chan_hold(chan);
346

347
	list_add(&chan->list, &conn->chan_l);
348 349
}

350
static void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
351 352 353
{
	mutex_lock(&conn->chan_lock);
	__l2cap_chan_add(conn, chan);
354
	mutex_unlock(&conn->chan_lock);
355 356
}

357
static void l2cap_chan_del(struct l2cap_chan *chan, int err)
358
{
359
	struct sock *sk = chan->sk;
360
	struct l2cap_conn *conn = chan->conn;
361 362
	struct sock *parent = bt_sk(sk)->parent;

363
	__clear_chan_timer(chan);
364

365
	BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
366

367
	if (conn) {
368
		/* Delete from channel list */
369
		list_del(&chan->list);
370

371
		l2cap_chan_put(chan);
372

373
		chan->conn = NULL;
374 375 376
		hci_conn_put(conn->hcon);
	}

377 378
	lock_sock(sk);

379
	__l2cap_state_change(chan, BT_CLOSED);
380 381 382
	sock_set_flag(sk, SOCK_ZAPPED);

	if (err)
383
		__l2cap_chan_set_err(chan, err);
384 385 386 387 388 389

	if (parent) {
		bt_accept_unlink(sk);
		parent->sk_data_ready(parent, 0);
	} else
		sk->sk_state_change(sk);
390

391 392
	release_sock(sk);

393 394
	if (!(test_bit(CONF_OUTPUT_DONE, &chan->conf_state) &&
			test_bit(CONF_INPUT_DONE, &chan->conf_state)))
395
		return;
396

397
	skb_queue_purge(&chan->tx_q);
398

399
	if (chan->mode == L2CAP_MODE_ERTM) {
400 401
		struct srej_list *l, *tmp;

402 403 404
		__clear_retrans_timer(chan);
		__clear_monitor_timer(chan);
		__clear_ack_timer(chan);
405

406
		skb_queue_purge(&chan->srej_q);
407

408
		list_for_each_entry_safe(l, tmp, &chan->srej_l, list) {
409 410 411 412
			list_del(&l->list);
			kfree(l);
		}
	}
413 414
}

415 416 417 418 419 420 421
static void l2cap_chan_cleanup_listen(struct sock *parent)
{
	struct sock *sk;

	BT_DBG("parent %p", parent);

	/* Close not yet accepted channels */
422
	while ((sk = bt_accept_dequeue(parent, NULL))) {
423
		struct l2cap_chan *chan = l2cap_pi(sk)->chan;
424

425
		l2cap_chan_lock(chan);
426
		__clear_chan_timer(chan);
427
		l2cap_chan_close(chan, ECONNRESET);
428
		l2cap_chan_unlock(chan);
429

430
		chan->ops->close(chan->data);
431
	}
432 433
}

434
void l2cap_chan_close(struct l2cap_chan *chan, int reason)
435 436 437 438
{
	struct l2cap_conn *conn = chan->conn;
	struct sock *sk = chan->sk;

439 440
	BT_DBG("chan %p state %s sk %p", chan,
					state_to_string(chan->state), sk);
441

442
	switch (chan->state) {
443
	case BT_LISTEN:
444
		lock_sock(sk);
445
		l2cap_chan_cleanup_listen(sk);
446

447
		__l2cap_state_change(chan, BT_CLOSED);
448
		sock_set_flag(sk, SOCK_ZAPPED);
449
		release_sock(sk);
450 451 452 453
		break;

	case BT_CONNECTED:
	case BT_CONFIG:
454
		if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED &&
455
					conn->hcon->type == ACL_LINK) {
456
			__set_chan_timer(chan, sk->sk_sndtimeo);
457 458 459 460 461 462
			l2cap_send_disconn_req(conn, chan, reason);
		} else
			l2cap_chan_del(chan, reason);
		break;

	case BT_CONNECT2:
463
		if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED &&
464 465 466 467 468 469 470 471
					conn->hcon->type == ACL_LINK) {
			struct l2cap_conn_rsp rsp;
			__u16 result;

			if (bt_sk(sk)->defer_setup)
				result = L2CAP_CR_SEC_BLOCK;
			else
				result = L2CAP_CR_BAD_PSM;
472
			l2cap_state_change(chan, BT_DISCONN);
473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490

			rsp.scid   = cpu_to_le16(chan->dcid);
			rsp.dcid   = cpu_to_le16(chan->scid);
			rsp.result = cpu_to_le16(result);
			rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
			l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
							sizeof(rsp), &rsp);
		}

		l2cap_chan_del(chan, reason);
		break;

	case BT_CONNECT:
	case BT_DISCONN:
		l2cap_chan_del(chan, reason);
		break;

	default:
491
		lock_sock(sk);
492
		sock_set_flag(sk, SOCK_ZAPPED);
493
		release_sock(sk);
494 495 496 497
		break;
	}
}

498
static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
499
{
500
	if (chan->chan_type == L2CAP_CHAN_RAW) {
501
		switch (chan->sec_level) {
502 503 504 505 506 507 508
		case BT_SECURITY_HIGH:
			return HCI_AT_DEDICATED_BONDING_MITM;
		case BT_SECURITY_MEDIUM:
			return HCI_AT_DEDICATED_BONDING;
		default:
			return HCI_AT_NO_BONDING;
		}
509
	} else if (chan->psm == cpu_to_le16(0x0001)) {
510 511
		if (chan->sec_level == BT_SECURITY_LOW)
			chan->sec_level = BT_SECURITY_SDP;
512

513
		if (chan->sec_level == BT_SECURITY_HIGH)
514
			return HCI_AT_NO_BONDING_MITM;
515
		else
516
			return HCI_AT_NO_BONDING;
517
	} else {
518
		switch (chan->sec_level) {
519
		case BT_SECURITY_HIGH:
520
			return HCI_AT_GENERAL_BONDING_MITM;
521
		case BT_SECURITY_MEDIUM:
522
			return HCI_AT_GENERAL_BONDING;
523
		default:
524
			return HCI_AT_NO_BONDING;
525
		}
526
	}
527 528 529
}

/* Service level security */
530
int l2cap_chan_check_security(struct l2cap_chan *chan)
531
{
532
	struct l2cap_conn *conn = chan->conn;
533 534
	__u8 auth_type;

535
	auth_type = l2cap_get_auth_type(chan);
536

537
	return hci_conn_security(conn->hcon, chan->sec_level, auth_type);
538 539
}

540
static u8 l2cap_get_ident(struct l2cap_conn *conn)
541 542 543 544 545 546 547 548 549
{
	u8 id;

	/* Get next available identificator.
	 *    1 - 128 are used by kernel.
	 *  129 - 199 are reserved.
	 *  200 - 254 are used by utilities like l2ping, etc.
	 */

550
	spin_lock(&conn->lock);
551 552 553 554 555 556

	if (++conn->tx_ident > 128)
		conn->tx_ident = 1;

	id = conn->tx_ident;

557
	spin_unlock(&conn->lock);
558 559 560 561

	return id;
}

562
static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data)
563 564
{
	struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
565
	u8 flags;
566 567 568 569

	BT_DBG("code 0x%2.2x", code);

	if (!skb)
570
		return;
571

572 573 574 575 576
	if (lmp_no_flush_capable(conn->hcon->hdev))
		flags = ACL_START_NO_FLUSH;
	else
		flags = ACL_START;

577
	bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
578
	skb->priority = HCI_PRIO_MAX;
579

580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
	hci_send_acl(conn->hchan, skb, flags);
}

static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
{
	struct hci_conn *hcon = chan->conn->hcon;
	u16 flags;

	BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
							skb->priority);

	if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
					lmp_no_flush_capable(hcon->hdev))
		flags = ACL_START_NO_FLUSH;
	else
		flags = ACL_START;
596

597 598
	bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
	hci_send_acl(chan->conn->hchan, skb, flags);
599 600
}

601
static inline void l2cap_send_sframe(struct l2cap_chan *chan, u32 control)
602 603 604
{
	struct sk_buff *skb;
	struct l2cap_hdr *lh;
605
	struct l2cap_conn *conn = chan->conn;
606
	int count, hlen;
607

608
	if (chan->state != BT_CONNECTED)
609 610
		return;

611 612 613 614 615
	if (test_bit(FLAG_EXT_CTRL, &chan->flags))
		hlen = L2CAP_EXT_HDR_SIZE;
	else
		hlen = L2CAP_ENH_HDR_SIZE;

616
	if (chan->fcs == L2CAP_FCS_CRC16)
617
		hlen += L2CAP_FCS_SIZE;
618

619
	BT_DBG("chan %p, control 0x%8.8x", chan, control);
620

621
	count = min_t(unsigned int, conn->mtu, hlen);
622 623

	control |= __set_sframe(chan);
624

625
	if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
626
		control |= __set_ctrl_final(chan);
627

628
	if (test_and_clear_bit(CONN_SEND_PBIT, &chan->conn_state))
629
		control |= __set_ctrl_poll(chan);
630

631 632
	skb = bt_skb_alloc(count, GFP_ATOMIC);
	if (!skb)
633
		return;
634 635

	lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
636
	lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
637
	lh->cid = cpu_to_le16(chan->dcid);
638 639

	__put_control(chan, control, skb_put(skb, __ctrl_size(chan)));
640

641
	if (chan->fcs == L2CAP_FCS_CRC16) {
642 643
		u16 fcs = crc16(0, (u8 *)lh, count - L2CAP_FCS_SIZE);
		put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
644 645
	}

646 647
	skb->priority = HCI_PRIO_MAX;
	l2cap_do_send(chan, skb);
648 649
}

650
static inline void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, u32 control)
651
{
652
	if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
653
		control |= __set_ctrl_super(chan, L2CAP_SUPER_RNR);
654
		set_bit(CONN_RNR_SENT, &chan->conn_state);
655
	} else
656
		control |= __set_ctrl_super(chan, L2CAP_SUPER_RR);
657

658
	control |= __set_reqseq(chan, chan->buffer_seq);
659

660
	l2cap_send_sframe(chan, control);
661 662
}

663
static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
664
{
665
	return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
666 667
}

668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
static void l2cap_send_conn_req(struct l2cap_chan *chan)
{
	struct l2cap_conn *conn = chan->conn;
	struct l2cap_conn_req req;

	req.scid = cpu_to_le16(chan->scid);
	req.psm  = chan->psm;

	chan->ident = l2cap_get_ident(conn);

	set_bit(CONF_CONNECT_PEND, &chan->conf_state);

	l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
}

683
static void l2cap_do_start(struct l2cap_chan *chan)
684
{
685
	struct l2cap_conn *conn = chan->conn;
686 687

	if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
688 689 690
		if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
			return;

691
		if (l2cap_chan_check_security(chan) &&
692 693
				__l2cap_no_conn_pending(chan))
			l2cap_send_conn_req(chan);
694 695 696 697 698 699 700
	} else {
		struct l2cap_info_req req;
		req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);

		conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
		conn->info_ident = l2cap_get_ident(conn);

701
		schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
702 703 704 705 706 707

		l2cap_send_cmd(conn, conn->info_ident,
					L2CAP_INFO_REQ, sizeof(req), &req);
	}
}

708 709 710
static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
{
	u32 local_feat_mask = l2cap_feat_mask;
711
	if (!disable_ertm)
712 713 714 715 716 717 718 719 720 721 722 723
		local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;

	switch (mode) {
	case L2CAP_MODE_ERTM:
		return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
	case L2CAP_MODE_STREAMING:
		return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
	default:
		return 0x00;
	}
}

724
static void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, int err)
725
{
726
	struct sock *sk = chan->sk;
727 728
	struct l2cap_disconn_req req;

729 730 731
	if (!conn)
		return;

732
	if (chan->mode == L2CAP_MODE_ERTM) {
733 734 735
		__clear_retrans_timer(chan);
		__clear_monitor_timer(chan);
		__clear_ack_timer(chan);
736 737
	}

738 739
	req.dcid = cpu_to_le16(chan->dcid);
	req.scid = cpu_to_le16(chan->scid);
740 741
	l2cap_send_cmd(conn, l2cap_get_ident(conn),
			L2CAP_DISCONN_REQ, sizeof(req), &req);
742

743
	lock_sock(sk);
744
	__l2cap_state_change(chan, BT_DISCONN);
745
	__l2cap_chan_set_err(chan, err);
746
	release_sock(sk);
747 748
}

L
Linus Torvalds 已提交
749
/* ---- L2CAP connections ---- */
750 751
static void l2cap_conn_start(struct l2cap_conn *conn)
{
752
	struct l2cap_chan *chan, *tmp;
753 754 755

	BT_DBG("conn %p", conn);

756
	mutex_lock(&conn->chan_lock);
757

758
	list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
759
		struct sock *sk = chan->sk;
760

761
		l2cap_chan_lock(chan);
762

763
		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
764
			l2cap_chan_unlock(chan);
765 766 767
			continue;
		}

768
		if (chan->state == BT_CONNECT) {
769
			if (!l2cap_chan_check_security(chan) ||
770
					!__l2cap_no_conn_pending(chan)) {
771
				l2cap_chan_unlock(chan);
772 773
				continue;
			}
774

775 776 777
			if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
					&& test_bit(CONF_STATE2_DEVICE,
					&chan->conf_state)) {
778
				l2cap_chan_close(chan, ECONNRESET);
779
				l2cap_chan_unlock(chan);
780
				continue;
781
			}
782

783
			l2cap_send_conn_req(chan);
784

785
		} else if (chan->state == BT_CONNECT2) {
786
			struct l2cap_conn_rsp rsp;
787
			char buf[128];
788 789
			rsp.scid = cpu_to_le16(chan->dcid);
			rsp.dcid = cpu_to_le16(chan->scid);
790

791
			if (l2cap_chan_check_security(chan)) {
792
				lock_sock(sk);
793 794 795 796
				if (bt_sk(sk)->defer_setup) {
					struct sock *parent = bt_sk(sk)->parent;
					rsp.result = cpu_to_le16(L2CAP_CR_PEND);
					rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
797 798
					if (parent)
						parent->sk_data_ready(parent, 0);
799 800

				} else {
801
					__l2cap_state_change(chan, BT_CONFIG);
802 803 804
					rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
					rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
				}
805
				release_sock(sk);
806 807 808 809 810
			} else {
				rsp.result = cpu_to_le16(L2CAP_CR_PEND);
				rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
			}

811 812
			l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
							sizeof(rsp), &rsp);
813

814
			if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
815
					rsp.result != L2CAP_CR_SUCCESS) {
816
				l2cap_chan_unlock(chan);
817 818 819
				continue;
			}

820
			set_bit(CONF_REQ_SENT, &chan->conf_state);
821
			l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
822 823
						l2cap_build_conf_req(chan, buf), buf);
			chan->num_conf_req++;
824 825
		}

826
		l2cap_chan_unlock(chan);
827 828
	}

829
	mutex_unlock(&conn->chan_lock);
830 831
}

832 833 834
/* Find socket with cid and source bdaddr.
 * Returns closest match, locked.
 */
835 836
static struct l2cap_chan *l2cap_global_chan_by_scid(int state, u16 cid,
						    bdaddr_t *src)
837
{
838
	struct l2cap_chan *c, *c1 = NULL;
839

840
	read_lock(&chan_list_lock);
841

842 843
	list_for_each_entry(c, &chan_list, global_l) {
		struct sock *sk = c->sk;
844

845
		if (state && c->state != state)
846 847
			continue;

848
		if (c->scid == cid) {
849
			/* Exact match. */
850 851 852 853
			if (!bacmp(&bt_sk(sk)->src, src)) {
				read_unlock(&chan_list_lock);
				return c;
			}
854 855 856

			/* Closest match */
			if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY))
857
				c1 = c;
858 859
		}
	}
860

861
	read_unlock(&chan_list_lock);
862

863
	return c1;
864 865 866 867
}

static void l2cap_le_conn_ready(struct l2cap_conn *conn)
{
868
	struct sock *parent, *sk;
869
	struct l2cap_chan *chan, *pchan;
870 871 872 873

	BT_DBG("");

	/* Check if we have socket listening on cid */
874
	pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_LE_DATA,
875
							conn->src);
876
	if (!pchan)
877 878
		return;

879 880
	parent = pchan->sk;

881
	lock_sock(parent);
882

883 884 885 886 887 888
	/* Check for backlog size */
	if (sk_acceptq_is_full(parent)) {
		BT_DBG("backlog full %d", parent->sk_ack_backlog);
		goto clean;
	}

889 890
	chan = pchan->ops->new_connection(pchan->data);
	if (!chan)
891 892
		goto clean;

893
	sk = chan->sk;
894

895 896 897 898 899
	hci_conn_hold(conn->hcon);

	bacpy(&bt_sk(sk)->src, conn->src);
	bacpy(&bt_sk(sk)->dst, conn->dst);

900 901
	bt_accept_enqueue(parent, sk);

902
	l2cap_chan_add(conn, chan);
903

904
	__set_chan_timer(chan, sk->sk_sndtimeo);
905

906
	__l2cap_state_change(chan, BT_CONNECTED);
907 908 909
	parent->sk_data_ready(parent, 0);

clean:
910
	release_sock(parent);
911 912
}

913
static void l2cap_chan_ready(struct l2cap_chan *chan)
914
{
915
	struct sock *sk = chan->sk;
916 917 918 919 920
	struct sock *parent;

	lock_sock(sk);

	parent = bt_sk(sk)->parent;
921 922 923 924 925 926

	BT_DBG("sk %p, parent %p", sk, parent);

	chan->conf_state = 0;
	__clear_chan_timer(chan);

927
	__l2cap_state_change(chan, BT_CONNECTED);
928 929 930 931
	sk->sk_state_change(sk);

	if (parent)
		parent->sk_data_ready(parent, 0);
932 933

	release_sock(sk);
934 935
}

936 937
static void l2cap_conn_ready(struct l2cap_conn *conn)
{
938
	struct l2cap_chan *chan;
939

940
	BT_DBG("conn %p", conn);
941

942 943 944
	if (!conn->hcon->out && conn->hcon->type == LE_LINK)
		l2cap_le_conn_ready(conn);

945 946 947
	if (conn->hcon->out && conn->hcon->type == LE_LINK)
		smp_conn_security(conn, conn->hcon->pending_sec_level);

948
	mutex_lock(&conn->chan_lock);
949

950
	list_for_each_entry(chan, &conn->chan_l, list) {
951

952
		l2cap_chan_lock(chan);
953

954
		if (conn->hcon->type == LE_LINK) {
955
			if (smp_conn_security(conn, chan->sec_level))
956
				l2cap_chan_ready(chan);
957

958
		} else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
959
			struct sock *sk = chan->sk;
960
			__clear_chan_timer(chan);
961
			lock_sock(sk);
962
			__l2cap_state_change(chan, BT_CONNECTED);
963
			sk->sk_state_change(sk);
964
			release_sock(sk);
965

966
		} else if (chan->state == BT_CONNECT)
967
			l2cap_do_start(chan);
968

969
		l2cap_chan_unlock(chan);
970
	}
971

972
	mutex_unlock(&conn->chan_lock);
973 974 975 976 977
}

/* Notify sockets that we cannot guaranty reliability anymore */
static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
{
978
	struct l2cap_chan *chan;
979 980 981

	BT_DBG("conn %p", conn);

982
	mutex_lock(&conn->chan_lock);
983

984
	list_for_each_entry(chan, &conn->chan_l, list) {
985
		if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
986
			__l2cap_chan_set_err(chan, err);
987 988
	}

989
	mutex_unlock(&conn->chan_lock);
990 991
}

992
static void l2cap_info_timeout(struct work_struct *work)
993
{
994
	struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
995
							info_timer.work);
996

997
	conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
998
	conn->info_ident = 0;
999

1000 1001 1002
	l2cap_conn_start(conn);
}

1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
static void l2cap_conn_del(struct hci_conn *hcon, int err)
{
	struct l2cap_conn *conn = hcon->l2cap_data;
	struct l2cap_chan *chan, *l;

	if (!conn)
		return;

	BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);

	kfree_skb(conn->rx_skb);

1015 1016
	mutex_lock(&conn->chan_lock);

1017 1018
	/* Kill channels */
	list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
1019 1020
		l2cap_chan_lock(chan);

1021
		l2cap_chan_del(chan, err);
1022 1023 1024

		l2cap_chan_unlock(chan);

1025 1026 1027
		chan->ops->close(chan->data);
	}

1028 1029
	mutex_unlock(&conn->chan_lock);

1030 1031
	hci_chan_del(conn->hchan);

1032
	if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
1033
		cancel_delayed_work_sync(&conn->info_timer);
1034

1035
	if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
1036
		cancel_delayed_work_sync(&conn->security_timer);
1037
		smp_chan_destroy(conn);
1038
	}
1039 1040 1041 1042 1043

	hcon->l2cap_data = NULL;
	kfree(conn);
}

1044
static void security_timeout(struct work_struct *work)
1045
{
1046 1047
	struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
						security_timer.work);
1048 1049 1050 1051

	l2cap_conn_del(conn->hcon, ETIMEDOUT);
}

L
Linus Torvalds 已提交
1052 1053
static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status)
{
1054
	struct l2cap_conn *conn = hcon->l2cap_data;
1055
	struct hci_chan *hchan;
L
Linus Torvalds 已提交
1056

1057
	if (conn || status)
L
Linus Torvalds 已提交
1058 1059
		return conn;

1060 1061 1062 1063
	hchan = hci_chan_create(hcon);
	if (!hchan)
		return NULL;

1064
	conn = kzalloc(sizeof(struct l2cap_conn), GFP_ATOMIC);
1065 1066
	if (!conn) {
		hci_chan_del(hchan);
L
Linus Torvalds 已提交
1067
		return NULL;
1068
	}
L
Linus Torvalds 已提交
1069 1070 1071

	hcon->l2cap_data = conn;
	conn->hcon = hcon;
1072
	conn->hchan = hchan;
L
Linus Torvalds 已提交
1073

1074
	BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
1075

1076 1077 1078 1079 1080
	if (hcon->hdev->le_mtu && hcon->type == LE_LINK)
		conn->mtu = hcon->hdev->le_mtu;
	else
		conn->mtu = hcon->hdev->acl_mtu;

L
Linus Torvalds 已提交
1081 1082 1083
	conn->src = &hcon->hdev->bdaddr;
	conn->dst = &hcon->dst;

1084 1085
	conn->feat_mask = 0;

L
Linus Torvalds 已提交
1086
	spin_lock_init(&conn->lock);
1087
	mutex_init(&conn->chan_lock);
1088 1089

	INIT_LIST_HEAD(&conn->chan_l);
L
Linus Torvalds 已提交
1090

1091
	if (hcon->type == LE_LINK)
1092
		INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
1093
	else
1094
		INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
D
Dave Young 已提交
1095

1096
	conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
1097

L
Linus Torvalds 已提交
1098 1099 1100 1101 1102 1103 1104 1105
	return conn;
}

/* ---- Socket interface ---- */

/* Find socket with psm and source bdaddr.
 * Returns closest match.
 */
1106
static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm, bdaddr_t *src)
L
Linus Torvalds 已提交
1107
{
1108
	struct l2cap_chan *c, *c1 = NULL;
L
Linus Torvalds 已提交
1109

1110
	read_lock(&chan_list_lock);
1111

1112 1113
	list_for_each_entry(c, &chan_list, global_l) {
		struct sock *sk = c->sk;
1114

1115
		if (state && c->state != state)
L
Linus Torvalds 已提交
1116 1117
			continue;

1118
		if (c->psm == psm) {
L
Linus Torvalds 已提交
1119
			/* Exact match. */
1120
			if (!bacmp(&bt_sk(sk)->src, src)) {
1121
				read_unlock(&chan_list_lock);
1122 1123
				return c;
			}
L
Linus Torvalds 已提交
1124 1125 1126

			/* Closest match */
			if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY))
1127
				c1 = c;
L
Linus Torvalds 已提交
1128 1129 1130
		}
	}

1131
	read_unlock(&chan_list_lock);
1132

1133
	return c1;
L
Linus Torvalds 已提交
1134 1135
}

1136
int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, bdaddr_t *dst)
L
Linus Torvalds 已提交
1137
{
1138
	struct sock *sk = chan->sk;
L
Linus Torvalds 已提交
1139 1140 1141 1142
	bdaddr_t *src = &bt_sk(sk)->src;
	struct l2cap_conn *conn;
	struct hci_conn *hcon;
	struct hci_dev *hdev;
1143
	__u8 auth_type;
1144
	int err;
L
Linus Torvalds 已提交
1145

1146
	BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst),
1147
	       __le16_to_cpu(chan->psm));
L
Linus Torvalds 已提交
1148

1149 1150
	hdev = hci_get_route(dst, src);
	if (!hdev)
L
Linus Torvalds 已提交
1151 1152
		return -EHOSTUNREACH;

1153
	hci_dev_lock(hdev);
L
Linus Torvalds 已提交
1154

1155
	l2cap_chan_lock(chan);
1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181

	/* PSM must be odd and lsb of upper byte must be 0 */
	if ((__le16_to_cpu(psm) & 0x0101) != 0x0001 && !cid &&
					chan->chan_type != L2CAP_CHAN_RAW) {
		err = -EINVAL;
		goto done;
	}

	if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !(psm || cid)) {
		err = -EINVAL;
		goto done;
	}

	switch (chan->mode) {
	case L2CAP_MODE_BASIC:
		break;
	case L2CAP_MODE_ERTM:
	case L2CAP_MODE_STREAMING:
		if (!disable_ertm)
			break;
		/* fall through */
	default:
		err = -ENOTSUPP;
		goto done;
	}

1182 1183
	lock_sock(sk);

1184 1185 1186 1187 1188 1189
	switch (sk->sk_state) {
	case BT_CONNECT:
	case BT_CONNECT2:
	case BT_CONFIG:
		/* Already connecting */
		err = 0;
1190
		release_sock(sk);
1191 1192 1193 1194 1195
		goto done;

	case BT_CONNECTED:
		/* Already connected */
		err = -EISCONN;
1196
		release_sock(sk);
1197 1198 1199 1200 1201 1202 1203 1204 1205
		goto done;

	case BT_OPEN:
	case BT_BOUND:
		/* Can connect */
		break;

	default:
		err = -EBADFD;
1206
		release_sock(sk);
1207 1208 1209 1210
		goto done;
	}

	/* Set destination address and psm */
1211
	bacpy(&bt_sk(sk)->dst, dst);
1212 1213 1214

	release_sock(sk);

1215 1216
	chan->psm = psm;
	chan->dcid = cid;
L
Linus Torvalds 已提交
1217

1218
	auth_type = l2cap_get_auth_type(chan);
1219

1220
	if (chan->dcid == L2CAP_CID_LE_DATA)
1221
		hcon = hci_connect(hdev, LE_LINK, dst,
1222
					chan->sec_level, auth_type);
1223 1224
	else
		hcon = hci_connect(hdev, ACL_LINK, dst,
1225
					chan->sec_level, auth_type);
1226

1227 1228
	if (IS_ERR(hcon)) {
		err = PTR_ERR(hcon);
L
Linus Torvalds 已提交
1229
		goto done;
1230
	}
L
Linus Torvalds 已提交
1231 1232 1233 1234

	conn = l2cap_conn_add(hcon, 0);
	if (!conn) {
		hci_conn_put(hcon);
1235
		err = -ENOMEM;
L
Linus Torvalds 已提交
1236 1237 1238 1239 1240 1241
		goto done;
	}

	/* Update source addr of the socket */
	bacpy(src, conn->src);

1242
	l2cap_chan_unlock(chan);
1243
	l2cap_chan_add(conn, chan);
1244
	l2cap_chan_lock(chan);
1245

1246
	l2cap_state_change(chan, BT_CONNECT);
1247
	__set_chan_timer(chan, sk->sk_sndtimeo);
L
Linus Torvalds 已提交
1248 1249

	if (hcon->state == BT_CONNECTED) {
1250
		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
1251
			__clear_chan_timer(chan);
1252
			if (l2cap_chan_check_security(chan))
1253
				l2cap_state_change(chan, BT_CONNECTED);
1254
		} else
1255
			l2cap_do_start(chan);
L
Linus Torvalds 已提交
1256 1257
	}

1258 1259
	err = 0;

L
Linus Torvalds 已提交
1260
done:
1261
	l2cap_chan_unlock(chan);
1262
	hci_dev_unlock(hdev);
L
Linus Torvalds 已提交
1263 1264 1265 1266
	hci_dev_put(hdev);
	return err;
}

1267
int __l2cap_wait_ack(struct sock *sk)
1268
{
1269
	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1270 1271 1272 1273
	DECLARE_WAITQUEUE(wait, current);
	int err = 0;
	int timeo = HZ/5;

1274
	add_wait_queue(sk_sleep(sk), &wait);
1275 1276
	set_current_state(TASK_INTERRUPTIBLE);
	while (chan->unacked_frames > 0 && chan->conn) {
1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287
		if (!timeo)
			timeo = HZ/5;

		if (signal_pending(current)) {
			err = sock_intr_errno(timeo);
			break;
		}

		release_sock(sk);
		timeo = schedule_timeout(timeo);
		lock_sock(sk);
1288
		set_current_state(TASK_INTERRUPTIBLE);
1289 1290 1291 1292 1293 1294

		err = sock_error(sk);
		if (err)
			break;
	}
	set_current_state(TASK_RUNNING);
1295
	remove_wait_queue(sk_sleep(sk), &wait);
1296 1297 1298
	return err;
}

1299
static void l2cap_monitor_timeout(struct work_struct *work)
1300
{
1301 1302
	struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
							monitor_timer.work);
1303

1304
	BT_DBG("chan %p", chan);
1305

1306 1307
	l2cap_chan_lock(chan);

1308
	if (chan->retry_count >= chan->remote_max_tx) {
1309
		l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED);
1310
		l2cap_chan_unlock(chan);
1311
		l2cap_chan_put(chan);
1312 1313 1314
		return;
	}

1315
	chan->retry_count++;
1316
	__set_monitor_timer(chan);
1317

1318
	l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL);
1319
	l2cap_chan_unlock(chan);
1320
	l2cap_chan_put(chan);
1321 1322
}

1323
static void l2cap_retrans_timeout(struct work_struct *work)
1324
{
1325 1326
	struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
							retrans_timer.work);
1327

1328
	BT_DBG("chan %p", chan);
1329

1330 1331
	l2cap_chan_lock(chan);

1332
	chan->retry_count = 1;
1333
	__set_monitor_timer(chan);
1334

1335
	set_bit(CONN_WAIT_F, &chan->conn_state);
1336

1337
	l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL);
1338 1339

	l2cap_chan_unlock(chan);
1340
	l2cap_chan_put(chan);
1341 1342
}

1343
static void l2cap_drop_acked_frames(struct l2cap_chan *chan)
L
Linus Torvalds 已提交
1344
{
1345
	struct sk_buff *skb;
L
Linus Torvalds 已提交
1346

1347
	while ((skb = skb_peek(&chan->tx_q)) &&
1348
			chan->unacked_frames) {
1349
		if (bt_cb(skb)->tx_seq == chan->expected_ack_seq)
1350
			break;
L
Linus Torvalds 已提交
1351

1352
		skb = skb_dequeue(&chan->tx_q);
1353
		kfree_skb(skb);
L
Linus Torvalds 已提交
1354

1355
		chan->unacked_frames--;
1356
	}
L
Linus Torvalds 已提交
1357

1358
	if (!chan->unacked_frames)
1359
		__clear_retrans_timer(chan);
1360
}
L
Linus Torvalds 已提交
1361

1362
static void l2cap_streaming_send(struct l2cap_chan *chan)
1363
{
1364
	struct sk_buff *skb;
1365 1366
	u32 control;
	u16 fcs;
1367

1368
	while ((skb = skb_dequeue(&chan->tx_q))) {
1369
		control = __get_control(chan, skb->data + L2CAP_HDR_SIZE);
1370
		control |= __set_txseq(chan, chan->next_tx_seq);
1371
		__put_control(chan, control, skb->data + L2CAP_HDR_SIZE);
1372

1373
		if (chan->fcs == L2CAP_FCS_CRC16) {
1374 1375 1376 1377
			fcs = crc16(0, (u8 *)skb->data,
						skb->len - L2CAP_FCS_SIZE);
			put_unaligned_le16(fcs,
					skb->data + skb->len - L2CAP_FCS_SIZE);
1378 1379
		}

1380
		l2cap_do_send(chan, skb);
1381

1382
		chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
1383 1384 1385
	}
}

1386
static void l2cap_retransmit_one_frame(struct l2cap_chan *chan, u16 tx_seq)
1387 1388
{
	struct sk_buff *skb, *tx_skb;
1389 1390
	u16 fcs;
	u32 control;
1391

1392
	skb = skb_peek(&chan->tx_q);
1393 1394
	if (!skb)
		return;
1395

1396
	while (bt_cb(skb)->tx_seq != tx_seq) {
1397
		if (skb_queue_is_last(&chan->tx_q, skb))
1398
			return;
1399

1400 1401
		skb = skb_queue_next(&chan->tx_q, skb);
	}
1402

1403 1404
	if (chan->remote_max_tx &&
			bt_cb(skb)->retries == chan->remote_max_tx) {
1405
		l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED);
1406 1407 1408 1409 1410
		return;
	}

	tx_skb = skb_clone(skb, GFP_ATOMIC);
	bt_cb(skb)->retries++;
1411 1412

	control = __get_control(chan, tx_skb->data + L2CAP_HDR_SIZE);
1413
	control &= __get_sar_mask(chan);
1414

1415
	if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1416
		control |= __set_ctrl_final(chan);
1417

1418
	control |= __set_reqseq(chan, chan->buffer_seq);
1419
	control |= __set_txseq(chan, tx_seq);
1420

1421
	__put_control(chan, control, tx_skb->data + L2CAP_HDR_SIZE);
1422

1423
	if (chan->fcs == L2CAP_FCS_CRC16) {
1424 1425 1426 1427
		fcs = crc16(0, (u8 *)tx_skb->data,
						tx_skb->len - L2CAP_FCS_SIZE);
		put_unaligned_le16(fcs,
				tx_skb->data + tx_skb->len - L2CAP_FCS_SIZE);
1428 1429
	}

1430
	l2cap_do_send(chan, tx_skb);
1431 1432
}

1433
static int l2cap_ertm_send(struct l2cap_chan *chan)
1434 1435
{
	struct sk_buff *skb, *tx_skb;
1436 1437
	u16 fcs;
	u32 control;
1438
	int nsent = 0;
1439

1440
	if (chan->state != BT_CONNECTED)
1441
		return -ENOTCONN;
1442

1443
	while ((skb = chan->tx_send_head) && (!l2cap_tx_window_full(chan))) {
1444

1445 1446
		if (chan->remote_max_tx &&
				bt_cb(skb)->retries == chan->remote_max_tx) {
1447
			l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED);
1448 1449 1450
			break;
		}

1451 1452
		tx_skb = skb_clone(skb, GFP_ATOMIC);

1453 1454
		bt_cb(skb)->retries++;

1455
		control = __get_control(chan, tx_skb->data + L2CAP_HDR_SIZE);
1456
		control &= __get_sar_mask(chan);
1457

1458
		if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1459
			control |= __set_ctrl_final(chan);
1460

1461
		control |= __set_reqseq(chan, chan->buffer_seq);
1462
		control |= __set_txseq(chan, chan->next_tx_seq);
1463

1464
		__put_control(chan, control, tx_skb->data + L2CAP_HDR_SIZE);
1465

1466
		if (chan->fcs == L2CAP_FCS_CRC16) {
1467 1468 1469 1470
			fcs = crc16(0, (u8 *)skb->data,
						tx_skb->len - L2CAP_FCS_SIZE);
			put_unaligned_le16(fcs, skb->data +
						tx_skb->len - L2CAP_FCS_SIZE);
1471 1472
		}

1473
		l2cap_do_send(chan, tx_skb);
1474

1475
		__set_retrans_timer(chan);
1476

1477
		bt_cb(skb)->tx_seq = chan->next_tx_seq;
1478 1479

		chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
1480

1481
		if (bt_cb(skb)->retries == 1) {
1482
			chan->unacked_frames++;
1483 1484 1485

			if (!nsent++)
				__clear_ack_timer(chan);
1486
		}
1487

1488
		chan->frames_sent++;
1489

1490 1491
		if (skb_queue_is_last(&chan->tx_q, skb))
			chan->tx_send_head = NULL;
1492
		else
1493
			chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
1494 1495
	}

1496 1497 1498
	return nsent;
}

1499
static int l2cap_retransmit_frames(struct l2cap_chan *chan)
1500 1501 1502
{
	int ret;

1503 1504
	if (!skb_queue_empty(&chan->tx_q))
		chan->tx_send_head = chan->tx_q.next;
1505

1506
	chan->next_tx_seq = chan->expected_ack_seq;
1507
	ret = l2cap_ertm_send(chan);
1508 1509 1510
	return ret;
}

1511
static void __l2cap_send_ack(struct l2cap_chan *chan)
1512
{
1513
	u32 control = 0;
1514

1515
	control |= __set_reqseq(chan, chan->buffer_seq);
1516

1517
	if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
1518
		control |= __set_ctrl_super(chan, L2CAP_SUPER_RNR);
1519
		set_bit(CONN_RNR_SENT, &chan->conn_state);
1520
		l2cap_send_sframe(chan, control);
1521
		return;
1522
	}
1523

1524
	if (l2cap_ertm_send(chan) > 0)
1525 1526
		return;

1527
	control |= __set_ctrl_super(chan, L2CAP_SUPER_RR);
1528
	l2cap_send_sframe(chan, control);
1529 1530
}

1531 1532 1533 1534 1535 1536
static void l2cap_send_ack(struct l2cap_chan *chan)
{
	__clear_ack_timer(chan);
	__l2cap_send_ack(chan);
}

1537
static void l2cap_send_srejtail(struct l2cap_chan *chan)
1538 1539
{
	struct srej_list *tail;
1540
	u32 control;
1541

1542
	control = __set_ctrl_super(chan, L2CAP_SUPER_SREJ);
1543
	control |= __set_ctrl_final(chan);
1544

1545
	tail = list_entry((&chan->srej_l)->prev, struct srej_list, list);
1546
	control |= __set_reqseq(chan, tail->tx_seq);
1547

1548
	l2cap_send_sframe(chan, control);
1549 1550
}

1551 1552 1553
static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
					 struct msghdr *msg, int len,
					 int count, struct sk_buff *skb)
1554
{
1555
	struct l2cap_conn *conn = chan->conn;
1556 1557
	struct sk_buff **frag;
	int err, sent = 0;
L
Linus Torvalds 已提交
1558

1559
	if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count))
1560
		return -EFAULT;
L
Linus Torvalds 已提交
1561 1562 1563 1564 1565 1566 1567 1568 1569

	sent += count;
	len  -= count;

	/* Continuation fragments (no L2CAP header) */
	frag = &skb_shinfo(skb)->frag_list;
	while (len) {
		count = min_t(unsigned int, conn->mtu, len);

1570
		*frag = chan->ops->alloc_skb(chan, count,
1571 1572
					     msg->msg_flags & MSG_DONTWAIT,
					     &err);
1573

L
Linus Torvalds 已提交
1574
		if (!*frag)
1575
			return err;
1576 1577
		if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count))
			return -EFAULT;
L
Linus Torvalds 已提交
1578

1579 1580
		(*frag)->priority = skb->priority;

L
Linus Torvalds 已提交
1581 1582 1583 1584 1585 1586 1587
		sent += count;
		len  -= count;

		frag = &(*frag)->next;
	}

	return sent;
1588
}
L
Linus Torvalds 已提交
1589

1590 1591 1592
static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
						struct msghdr *msg, size_t len,
						u32 priority)
1593
{
1594
	struct l2cap_conn *conn = chan->conn;
1595
	struct sk_buff *skb;
1596
	int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
1597 1598
	struct l2cap_hdr *lh;

1599
	BT_DBG("chan %p len %d priority %u", chan, (int)len, priority);
1600 1601

	count = min_t(unsigned int, (conn->mtu - hlen), len);
1602 1603

	skb = chan->ops->alloc_skb(chan, count + hlen,
1604
				   msg->msg_flags & MSG_DONTWAIT, &err);
1605

1606
	if (!skb)
1607
		return ERR_PTR(err);
1608

1609 1610
	skb->priority = priority;

1611 1612
	/* Create L2CAP header */
	lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
1613
	lh->cid = cpu_to_le16(chan->dcid);
1614
	lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
1615
	put_unaligned(chan->psm, skb_put(skb, 2));
1616

1617
	err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
1618 1619 1620 1621 1622 1623 1624
	if (unlikely(err < 0)) {
		kfree_skb(skb);
		return ERR_PTR(err);
	}
	return skb;
}

1625 1626 1627
static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
						struct msghdr *msg, size_t len,
						u32 priority)
1628
{
1629
	struct l2cap_conn *conn = chan->conn;
1630 1631 1632 1633
	struct sk_buff *skb;
	int err, count, hlen = L2CAP_HDR_SIZE;
	struct l2cap_hdr *lh;

1634
	BT_DBG("chan %p len %d", chan, (int)len);
1635 1636

	count = min_t(unsigned int, (conn->mtu - hlen), len);
1637 1638

	skb = chan->ops->alloc_skb(chan, count + hlen,
1639
				   msg->msg_flags & MSG_DONTWAIT, &err);
1640

1641
	if (!skb)
1642
		return ERR_PTR(err);
1643

1644 1645
	skb->priority = priority;

1646 1647
	/* Create L2CAP header */
	lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
1648
	lh->cid = cpu_to_le16(chan->dcid);
1649 1650
	lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));

1651
	err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
1652 1653 1654 1655 1656 1657 1658
	if (unlikely(err < 0)) {
		kfree_skb(skb);
		return ERR_PTR(err);
	}
	return skb;
}

1659 1660
static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
						struct msghdr *msg, size_t len,
1661
						u32 control, u16 sdulen)
1662
{
1663
	struct l2cap_conn *conn = chan->conn;
1664
	struct sk_buff *skb;
1665
	int err, count, hlen;
1666 1667
	struct l2cap_hdr *lh;

1668
	BT_DBG("chan %p len %d", chan, (int)len);
1669

1670 1671 1672
	if (!conn)
		return ERR_PTR(-ENOTCONN);

1673 1674 1675 1676 1677
	if (test_bit(FLAG_EXT_CTRL, &chan->flags))
		hlen = L2CAP_EXT_HDR_SIZE;
	else
		hlen = L2CAP_ENH_HDR_SIZE;

1678
	if (sdulen)
1679
		hlen += L2CAP_SDULEN_SIZE;
1680

1681
	if (chan->fcs == L2CAP_FCS_CRC16)
1682
		hlen += L2CAP_FCS_SIZE;
1683

1684
	count = min_t(unsigned int, (conn->mtu - hlen), len);
1685 1686 1687 1688

	skb = chan->ops->alloc_skb(chan, count + hlen,
					msg->msg_flags & MSG_DONTWAIT, &err);

1689
	if (!skb)
1690
		return ERR_PTR(err);
1691 1692 1693

	/* Create L2CAP header */
	lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
1694
	lh->cid = cpu_to_le16(chan->dcid);
1695
	lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
1696 1697 1698

	__put_control(chan, control, skb_put(skb, __ctrl_size(chan)));

1699
	if (sdulen)
1700
		put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
1701

1702
	err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
1703 1704 1705 1706
	if (unlikely(err < 0)) {
		kfree_skb(skb);
		return ERR_PTR(err);
	}
1707

1708
	if (chan->fcs == L2CAP_FCS_CRC16)
1709
		put_unaligned_le16(0, skb_put(skb, L2CAP_FCS_SIZE));
1710

1711
	bt_cb(skb)->retries = 0;
1712
	return skb;
L
Linus Torvalds 已提交
1713 1714
}

1715
static int l2cap_sar_segment_sdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
1716 1717 1718
{
	struct sk_buff *skb;
	struct sk_buff_head sar_queue;
1719
	u32 control;
1720 1721
	size_t size = 0;

1722
	skb_queue_head_init(&sar_queue);
1723
	control = __set_ctrl_sar(chan, L2CAP_SAR_START);
1724
	skb = l2cap_create_iframe_pdu(chan, msg, chan->remote_mps, control, len);
1725 1726 1727 1728
	if (IS_ERR(skb))
		return PTR_ERR(skb);

	__skb_queue_tail(&sar_queue, skb);
1729 1730
	len -= chan->remote_mps;
	size += chan->remote_mps;
1731 1732 1733 1734

	while (len > 0) {
		size_t buflen;

1735
		if (len > chan->remote_mps) {
1736
			control = __set_ctrl_sar(chan, L2CAP_SAR_CONTINUE);
1737
			buflen = chan->remote_mps;
1738
		} else {
1739
			control = __set_ctrl_sar(chan, L2CAP_SAR_END);
1740 1741 1742
			buflen = len;
		}

1743
		skb = l2cap_create_iframe_pdu(chan, msg, buflen, control, 0);
1744 1745 1746 1747 1748 1749 1750 1751 1752
		if (IS_ERR(skb)) {
			skb_queue_purge(&sar_queue);
			return PTR_ERR(skb);
		}

		__skb_queue_tail(&sar_queue, skb);
		len -= buflen;
		size += buflen;
	}
1753 1754 1755
	skb_queue_splice_tail(&sar_queue, &chan->tx_q);
	if (chan->tx_send_head == NULL)
		chan->tx_send_head = sar_queue.next;
1756 1757 1758 1759

	return size;
}

1760 1761
int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len,
								u32 priority)
1762 1763
{
	struct sk_buff *skb;
1764
	u32 control;
1765 1766 1767
	int err;

	/* Connectionless channel */
1768
	if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
1769
		skb = l2cap_create_connless_pdu(chan, msg, len, priority);
1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783
		if (IS_ERR(skb))
			return PTR_ERR(skb);

		l2cap_do_send(chan, skb);
		return len;
	}

	switch (chan->mode) {
	case L2CAP_MODE_BASIC:
		/* Check outgoing MTU */
		if (len > chan->omtu)
			return -EMSGSIZE;

		/* Create a basic PDU */
1784
		skb = l2cap_create_basic_pdu(chan, msg, len, priority);
1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795
		if (IS_ERR(skb))
			return PTR_ERR(skb);

		l2cap_do_send(chan, skb);
		err = len;
		break;

	case L2CAP_MODE_ERTM:
	case L2CAP_MODE_STREAMING:
		/* Entire SDU fits into one PDU */
		if (len <= chan->remote_mps) {
1796
			control = __set_ctrl_sar(chan, L2CAP_SAR_UNSEGMENTED);
1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819
			skb = l2cap_create_iframe_pdu(chan, msg, len, control,
									0);
			if (IS_ERR(skb))
				return PTR_ERR(skb);

			__skb_queue_tail(&chan->tx_q, skb);

			if (chan->tx_send_head == NULL)
				chan->tx_send_head = skb;

		} else {
			/* Segment SDU into multiples PDUs */
			err = l2cap_sar_segment_sdu(chan, msg, len);
			if (err < 0)
				return err;
		}

		if (chan->mode == L2CAP_MODE_STREAMING) {
			l2cap_streaming_send(chan);
			err = len;
			break;
		}

1820 1821
		if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
				test_bit(CONN_WAIT_F, &chan->conn_state)) {
1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839
			err = len;
			break;
		}

		err = l2cap_ertm_send(chan);
		if (err >= 0)
			err = len;

		break;

	default:
		BT_DBG("bad state %1.1x", chan->mode);
		err = -EBADFD;
	}

	return err;
}

L
Linus Torvalds 已提交
1840 1841 1842 1843
/* Copy frame to all raw sockets on that connection */
static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
{
	struct sk_buff *nskb;
1844
	struct l2cap_chan *chan;
L
Linus Torvalds 已提交
1845 1846 1847

	BT_DBG("conn %p", conn);

1848
	mutex_lock(&conn->chan_lock);
1849

1850
	list_for_each_entry(chan, &conn->chan_l, list) {
1851
		struct sock *sk = chan->sk;
1852
		if (chan->chan_type != L2CAP_CHAN_RAW)
L
Linus Torvalds 已提交
1853 1854 1855 1856 1857
			continue;

		/* Don't send frame to the socket it came from */
		if (skb->sk == sk)
			continue;
1858 1859
		nskb = skb_clone(skb, GFP_ATOMIC);
		if (!nskb)
L
Linus Torvalds 已提交
1860 1861
			continue;

1862
		if (chan->ops->recv(chan->data, nskb))
L
Linus Torvalds 已提交
1863 1864
			kfree_skb(nskb);
	}
1865

1866
	mutex_unlock(&conn->chan_lock);
L
Linus Torvalds 已提交
1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877
}

/* ---- L2CAP signalling commands ---- */
static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
				u8 code, u8 ident, u16 dlen, void *data)
{
	struct sk_buff *skb, **frag;
	struct l2cap_cmd_hdr *cmd;
	struct l2cap_hdr *lh;
	int len, count;

1878 1879
	BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %d",
			conn, code, ident, dlen);
L
Linus Torvalds 已提交
1880 1881 1882 1883 1884 1885 1886 1887 1888

	len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
	count = min_t(unsigned int, conn->mtu, len);

	skb = bt_skb_alloc(count, GFP_ATOMIC);
	if (!skb)
		return NULL;

	lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
1889
	lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
1890 1891 1892 1893 1894

	if (conn->hcon->type == LE_LINK)
		lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
	else
		lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
L
Linus Torvalds 已提交
1895 1896 1897 1898

	cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
	cmd->code  = code;
	cmd->ident = ident;
1899
	cmd->len   = cpu_to_le16(dlen);
L
Linus Torvalds 已提交
1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949

	if (dlen) {
		count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
		memcpy(skb_put(skb, count), data, count);
		data += count;
	}

	len -= skb->len;

	/* Continuation fragments (no L2CAP header) */
	frag = &skb_shinfo(skb)->frag_list;
	while (len) {
		count = min_t(unsigned int, conn->mtu, len);

		*frag = bt_skb_alloc(count, GFP_ATOMIC);
		if (!*frag)
			goto fail;

		memcpy(skb_put(*frag, count), data, count);

		len  -= count;
		data += count;

		frag = &(*frag)->next;
	}

	return skb;

fail:
	kfree_skb(skb);
	return NULL;
}

static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned long *val)
{
	struct l2cap_conf_opt *opt = *ptr;
	int len;

	len = L2CAP_CONF_OPT_SIZE + opt->len;
	*ptr += len;

	*type = opt->type;
	*olen = opt->len;

	switch (opt->len) {
	case 1:
		*val = *((u8 *) opt->val);
		break;

	case 2:
1950
		*val = get_unaligned_le16(opt->val);
L
Linus Torvalds 已提交
1951 1952 1953
		break;

	case 4:
1954
		*val = get_unaligned_le32(opt->val);
L
Linus Torvalds 已提交
1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980
		break;

	default:
		*val = (unsigned long) opt->val;
		break;
	}

	BT_DBG("type 0x%2.2x len %d val 0x%lx", *type, opt->len, *val);
	return len;
}

static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
{
	struct l2cap_conf_opt *opt = *ptr;

	BT_DBG("type 0x%2.2x len %d val 0x%lx", type, len, val);

	opt->type = type;
	opt->len  = len;

	switch (len) {
	case 1:
		*((u8 *) opt->val)  = val;
		break;

	case 2:
1981
		put_unaligned_le16(val, opt->val);
L
Linus Torvalds 已提交
1982 1983 1984
		break;

	case 4:
1985
		put_unaligned_le32(val, opt->val);
L
Linus Torvalds 已提交
1986 1987 1988 1989 1990 1991 1992 1993 1994 1995
		break;

	default:
		memcpy(opt->val, (void *) val, len);
		break;
	}

	*ptr += L2CAP_CONF_OPT_SIZE + len;
}

1996 1997 1998 1999
static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
{
	struct l2cap_conf_efs efs;

2000
	switch (chan->mode) {
2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026
	case L2CAP_MODE_ERTM:
		efs.id		= chan->local_id;
		efs.stype	= chan->local_stype;
		efs.msdu	= cpu_to_le16(chan->local_msdu);
		efs.sdu_itime	= cpu_to_le32(chan->local_sdu_itime);
		efs.acc_lat	= cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
		efs.flush_to	= cpu_to_le32(L2CAP_DEFAULT_FLUSH_TO);
		break;

	case L2CAP_MODE_STREAMING:
		efs.id		= 1;
		efs.stype	= L2CAP_SERV_BESTEFFORT;
		efs.msdu	= cpu_to_le16(chan->local_msdu);
		efs.sdu_itime	= cpu_to_le32(chan->local_sdu_itime);
		efs.acc_lat	= 0;
		efs.flush_to	= 0;
		break;

	default:
		return;
	}

	l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
							(unsigned long) &efs);
}

2027
static void l2cap_ack_timeout(struct work_struct *work)
2028
{
2029 2030
	struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
							ack_timer.work);
2031

2032 2033
	BT_DBG("chan %p", chan);

2034 2035
	l2cap_chan_lock(chan);

2036
	__l2cap_send_ack(chan);
2037 2038

	l2cap_chan_unlock(chan);
2039 2040

	l2cap_chan_put(chan);
2041 2042
}

2043
static inline void l2cap_ertm_init(struct l2cap_chan *chan)
2044
{
2045
	chan->expected_ack_seq = 0;
2046
	chan->unacked_frames = 0;
2047
	chan->buffer_seq = 0;
2048 2049
	chan->num_acked = 0;
	chan->frames_sent = 0;
2050

2051 2052 2053
	INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
	INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
	INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
2054

2055
	skb_queue_head_init(&chan->srej_q);
2056

2057
	INIT_LIST_HEAD(&chan->srej_l);
2058 2059
}

2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072
static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
{
	switch (mode) {
	case L2CAP_MODE_STREAMING:
	case L2CAP_MODE_ERTM:
		if (l2cap_mode_supported(mode, remote_feat_mask))
			return mode;
		/* fall through */
	default:
		return L2CAP_MODE_BASIC;
	}
}

2073 2074 2075 2076 2077
static inline bool __l2cap_ews_supported(struct l2cap_chan *chan)
{
	return enable_hs && chan->conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
}

2078 2079 2080 2081 2082
static inline bool __l2cap_efs_supported(struct l2cap_chan *chan)
{
	return enable_hs && chan->conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
}

2083 2084 2085
static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
{
	if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
2086
						__l2cap_ews_supported(chan)) {
2087 2088
		/* use extended control field */
		set_bit(FLAG_EXT_CTRL, &chan->flags);
2089 2090
		chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
	} else {
2091 2092
		chan->tx_win = min_t(u16, chan->tx_win,
						L2CAP_DEFAULT_TX_WINDOW);
2093 2094
		chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
	}
2095 2096
}

2097
static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
L
Linus Torvalds 已提交
2098 2099
{
	struct l2cap_conf_req *req = data;
2100
	struct l2cap_conf_rfc rfc = { .mode = chan->mode };
L
Linus Torvalds 已提交
2101
	void *ptr = req->data;
2102
	u16 size;
L
Linus Torvalds 已提交
2103

2104
	BT_DBG("chan %p", chan);
L
Linus Torvalds 已提交
2105

2106
	if (chan->num_conf_req || chan->num_conf_rsp)
2107 2108
		goto done;

2109
	switch (chan->mode) {
2110 2111
	case L2CAP_MODE_STREAMING:
	case L2CAP_MODE_ERTM:
2112
		if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
2113 2114
			break;

2115 2116 2117
		if (__l2cap_efs_supported(chan))
			set_bit(FLAG_EFS_ENABLE, &chan->flags);

2118
		/* fall through */
2119
	default:
2120
		chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
2121 2122 2123 2124
		break;
	}

done:
2125 2126
	if (chan->imtu != L2CAP_DEFAULT_MTU)
		l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
2127

2128
	switch (chan->mode) {
2129
	case L2CAP_MODE_BASIC:
2130 2131
		if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
				!(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
2132 2133
			break;

2134 2135 2136 2137 2138 2139 2140
		rfc.mode            = L2CAP_MODE_BASIC;
		rfc.txwin_size      = 0;
		rfc.max_transmit    = 0;
		rfc.retrans_timeout = 0;
		rfc.monitor_timeout = 0;
		rfc.max_pdu_size    = 0;

2141 2142
		l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
							(unsigned long) &rfc);
2143 2144 2145 2146
		break;

	case L2CAP_MODE_ERTM:
		rfc.mode            = L2CAP_MODE_ERTM;
2147
		rfc.max_transmit    = chan->max_tx;
2148 2149
		rfc.retrans_timeout = 0;
		rfc.monitor_timeout = 0;
2150 2151 2152 2153 2154 2155

		size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
						L2CAP_EXT_HDR_SIZE -
						L2CAP_SDULEN_SIZE -
						L2CAP_FCS_SIZE);
		rfc.max_pdu_size = cpu_to_le16(size);
2156

2157 2158 2159 2160
		l2cap_txwin_setup(chan);

		rfc.txwin_size = min_t(u16, chan->tx_win,
						L2CAP_DEFAULT_TX_WINDOW);
2161

2162 2163 2164
		l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
							(unsigned long) &rfc);

2165 2166 2167
		if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
			l2cap_add_opt_efs(&ptr, chan);

2168
		if (!(chan->conn->feat_mask & L2CAP_FEAT_FCS))
2169 2170
			break;

2171
		if (chan->fcs == L2CAP_FCS_NONE ||
2172
				test_bit(CONF_NO_FCS_RECV, &chan->conf_state)) {
2173 2174
			chan->fcs = L2CAP_FCS_NONE;
			l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, chan->fcs);
2175
		}
2176 2177 2178 2179

		if (test_bit(FLAG_EXT_CTRL, &chan->flags))
			l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
								chan->tx_win);
2180 2181 2182 2183 2184 2185 2186 2187
		break;

	case L2CAP_MODE_STREAMING:
		rfc.mode            = L2CAP_MODE_STREAMING;
		rfc.txwin_size      = 0;
		rfc.max_transmit    = 0;
		rfc.retrans_timeout = 0;
		rfc.monitor_timeout = 0;
2188 2189 2190 2191 2192 2193

		size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
						L2CAP_EXT_HDR_SIZE -
						L2CAP_SDULEN_SIZE -
						L2CAP_FCS_SIZE);
		rfc.max_pdu_size = cpu_to_le16(size);
2194

2195 2196 2197
		l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
							(unsigned long) &rfc);

2198 2199 2200
		if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
			l2cap_add_opt_efs(&ptr, chan);

2201
		if (!(chan->conn->feat_mask & L2CAP_FEAT_FCS))
2202 2203
			break;

2204
		if (chan->fcs == L2CAP_FCS_NONE ||
2205
				test_bit(CONF_NO_FCS_RECV, &chan->conf_state)) {
2206 2207
			chan->fcs = L2CAP_FCS_NONE;
			l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, chan->fcs);
2208
		}
2209 2210
		break;
	}
L
Linus Torvalds 已提交
2211

2212
	req->dcid  = cpu_to_le16(chan->dcid);
2213
	req->flags = cpu_to_le16(0);
L
Linus Torvalds 已提交
2214 2215 2216 2217

	return ptr - data;
}

2218
static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
L
Linus Torvalds 已提交
2219
{
2220 2221
	struct l2cap_conf_rsp *rsp = data;
	void *ptr = rsp->data;
2222 2223
	void *req = chan->conf_req;
	int len = chan->conf_len;
2224 2225
	int type, hint, olen;
	unsigned long val;
2226
	struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
2227 2228
	struct l2cap_conf_efs efs;
	u8 remote_efs = 0;
2229
	u16 mtu = L2CAP_DEFAULT_MTU;
2230
	u16 result = L2CAP_CONF_SUCCESS;
2231
	u16 size;
L
Linus Torvalds 已提交
2232

2233
	BT_DBG("chan %p", chan);
2234

2235 2236
	while (len >= L2CAP_CONF_OPT_SIZE) {
		len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
L
Linus Torvalds 已提交
2237

2238
		hint  = type & L2CAP_CONF_HINT;
2239
		type &= L2CAP_CONF_MASK;
2240 2241 2242

		switch (type) {
		case L2CAP_CONF_MTU:
2243
			mtu = val;
2244 2245 2246
			break;

		case L2CAP_CONF_FLUSH_TO:
2247
			chan->flush_to = val;
2248 2249 2250 2251 2252
			break;

		case L2CAP_CONF_QOS:
			break;

2253 2254 2255 2256 2257
		case L2CAP_CONF_RFC:
			if (olen == sizeof(rfc))
				memcpy(&rfc, (void *) val, olen);
			break;

2258 2259
		case L2CAP_CONF_FCS:
			if (val == L2CAP_FCS_NONE)
2260
				set_bit(CONF_NO_FCS_RECV, &chan->conf_state);
2261
			break;
2262

2263 2264 2265 2266
		case L2CAP_CONF_EFS:
			remote_efs = 1;
			if (olen == sizeof(efs))
				memcpy(&efs, (void *) val, olen);
2267 2268
			break;

2269 2270 2271
		case L2CAP_CONF_EWS:
			if (!enable_hs)
				return -ECONNREFUSED;
2272

2273 2274
			set_bit(FLAG_EXT_CTRL, &chan->flags);
			set_bit(CONF_EWS_RECV, &chan->conf_state);
2275
			chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
2276
			chan->remote_tx_win = val;
2277 2278
			break;

2279 2280 2281 2282 2283 2284 2285 2286 2287 2288
		default:
			if (hint)
				break;

			result = L2CAP_CONF_UNKNOWN;
			*((u8 *) ptr++) = type;
			break;
		}
	}

2289
	if (chan->num_conf_rsp || chan->num_conf_req > 1)
2290 2291
		goto done;

2292
	switch (chan->mode) {
2293 2294
	case L2CAP_MODE_STREAMING:
	case L2CAP_MODE_ERTM:
2295
		if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
2296
			chan->mode = l2cap_select_mode(rfc.mode,
2297
					chan->conn->feat_mask);
2298 2299 2300
			break;
		}

2301 2302 2303 2304 2305 2306 2307
		if (remote_efs) {
			if (__l2cap_efs_supported(chan))
				set_bit(FLAG_EFS_ENABLE, &chan->flags);
			else
				return -ECONNREFUSED;
		}

2308
		if (chan->mode != rfc.mode)
2309
			return -ECONNREFUSED;
2310

2311 2312 2313 2314
		break;
	}

done:
2315
	if (chan->mode != rfc.mode) {
2316
		result = L2CAP_CONF_UNACCEPT;
2317
		rfc.mode = chan->mode;
2318

2319
		if (chan->num_conf_rsp == 1)
2320 2321 2322 2323 2324 2325
			return -ECONNREFUSED;

		l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
					sizeof(rfc), (unsigned long) &rfc);
	}

2326 2327 2328 2329
	if (result == L2CAP_CONF_SUCCESS) {
		/* Configure output options and let the other side know
		 * which ones we don't like. */

2330 2331 2332
		if (mtu < L2CAP_DEFAULT_MIN_MTU)
			result = L2CAP_CONF_UNACCEPT;
		else {
2333
			chan->omtu = mtu;
2334
			set_bit(CONF_MTU_DONE, &chan->conf_state);
2335
		}
2336
		l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
2337

2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348
		if (remote_efs) {
			if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
					efs.stype != L2CAP_SERV_NOTRAFIC &&
					efs.stype != chan->local_stype) {

				result = L2CAP_CONF_UNACCEPT;

				if (chan->num_conf_req >= 1)
					return -ECONNREFUSED;

				l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
2349
							sizeof(efs),
2350
							(unsigned long) &efs);
2351
			} else {
2352
				/* Send PENDING Conf Rsp */
2353 2354
				result = L2CAP_CONF_PENDING;
				set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
2355 2356 2357
			}
		}

2358 2359
		switch (rfc.mode) {
		case L2CAP_MODE_BASIC:
2360
			chan->fcs = L2CAP_FCS_NONE;
2361
			set_bit(CONF_MODE_DONE, &chan->conf_state);
2362 2363 2364
			break;

		case L2CAP_MODE_ERTM:
2365 2366 2367 2368
			if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
				chan->remote_tx_win = rfc.txwin_size;
			else
				rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
2369

2370
			chan->remote_max_tx = rfc.max_transmit;
2371

2372 2373 2374 2375 2376 2377 2378
			size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
						chan->conn->mtu -
						L2CAP_EXT_HDR_SIZE -
						L2CAP_SDULEN_SIZE -
						L2CAP_FCS_SIZE);
			rfc.max_pdu_size = cpu_to_le16(size);
			chan->remote_mps = size;
2379

2380
			rfc.retrans_timeout =
2381
				__constant_cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
2382
			rfc.monitor_timeout =
2383
				__constant_cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
2384

2385
			set_bit(CONF_MODE_DONE, &chan->conf_state);
2386 2387 2388 2389

			l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
					sizeof(rfc), (unsigned long) &rfc);

2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402
			if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
				chan->remote_id = efs.id;
				chan->remote_stype = efs.stype;
				chan->remote_msdu = le16_to_cpu(efs.msdu);
				chan->remote_flush_to =
						le32_to_cpu(efs.flush_to);
				chan->remote_acc_lat =
						le32_to_cpu(efs.acc_lat);
				chan->remote_sdu_itime =
					le32_to_cpu(efs.sdu_itime);
				l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
					sizeof(efs), (unsigned long) &efs);
			}
2403 2404 2405
			break;

		case L2CAP_MODE_STREAMING:
2406 2407 2408 2409 2410 2411 2412
			size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
						chan->conn->mtu -
						L2CAP_EXT_HDR_SIZE -
						L2CAP_SDULEN_SIZE -
						L2CAP_FCS_SIZE);
			rfc.max_pdu_size = cpu_to_le16(size);
			chan->remote_mps = size;
2413

2414
			set_bit(CONF_MODE_DONE, &chan->conf_state);
2415 2416 2417 2418

			l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
					sizeof(rfc), (unsigned long) &rfc);

2419 2420 2421
			break;

		default:
2422 2423
			result = L2CAP_CONF_UNACCEPT;

2424
			memset(&rfc, 0, sizeof(rfc));
2425
			rfc.mode = chan->mode;
2426
		}
2427

2428
		if (result == L2CAP_CONF_SUCCESS)
2429
			set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
2430
	}
2431
	rsp->scid   = cpu_to_le16(chan->dcid);
2432 2433 2434 2435
	rsp->result = cpu_to_le16(result);
	rsp->flags  = cpu_to_le16(0x0000);

	return ptr - data;
L
Linus Torvalds 已提交
2436 2437
}

2438
static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, void *data, u16 *result)
2439 2440 2441 2442 2443
{
	struct l2cap_conf_req *req = data;
	void *ptr = req->data;
	int type, olen;
	unsigned long val;
2444
	struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
2445
	struct l2cap_conf_efs efs;
2446

2447
	BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
2448 2449 2450 2451 2452 2453 2454 2455

	while (len >= L2CAP_CONF_OPT_SIZE) {
		len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);

		switch (type) {
		case L2CAP_CONF_MTU:
			if (val < L2CAP_DEFAULT_MIN_MTU) {
				*result = L2CAP_CONF_UNACCEPT;
2456
				chan->imtu = L2CAP_DEFAULT_MIN_MTU;
2457
			} else
2458 2459
				chan->imtu = val;
			l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
2460 2461 2462
			break;

		case L2CAP_CONF_FLUSH_TO:
2463
			chan->flush_to = val;
2464
			l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
2465
							2, chan->flush_to);
2466 2467 2468 2469 2470 2471
			break;

		case L2CAP_CONF_RFC:
			if (olen == sizeof(rfc))
				memcpy(&rfc, (void *)val, olen);

2472
			if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
2473
							rfc.mode != chan->mode)
2474 2475
				return -ECONNREFUSED;

2476
			chan->fcs = 0;
2477 2478 2479 2480

			l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
					sizeof(rfc), (unsigned long) &rfc);
			break;
2481 2482 2483 2484

		case L2CAP_CONF_EWS:
			chan->tx_win = min_t(u16, val,
						L2CAP_DEFAULT_EXT_WINDOW);
2485 2486
			l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
							chan->tx_win);
2487
			break;
2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500

		case L2CAP_CONF_EFS:
			if (olen == sizeof(efs))
				memcpy(&efs, (void *)val, olen);

			if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
					efs.stype != L2CAP_SERV_NOTRAFIC &&
					efs.stype != chan->local_stype)
				return -ECONNREFUSED;

			l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
					sizeof(efs), (unsigned long) &efs);
			break;
2501 2502 2503
		}
	}

2504
	if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
2505 2506
		return -ECONNREFUSED;

2507
	chan->mode = rfc.mode;
2508

2509
	if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
2510 2511
		switch (rfc.mode) {
		case L2CAP_MODE_ERTM:
2512 2513 2514
			chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
			chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
			chan->mps    = le16_to_cpu(rfc.max_pdu_size);
2515 2516 2517 2518 2519 2520 2521 2522 2523

			if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
				chan->local_msdu = le16_to_cpu(efs.msdu);
				chan->local_sdu_itime =
						le32_to_cpu(efs.sdu_itime);
				chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
				chan->local_flush_to =
						le32_to_cpu(efs.flush_to);
			}
2524
			break;
2525

2526
		case L2CAP_MODE_STREAMING:
2527
			chan->mps    = le16_to_cpu(rfc.max_pdu_size);
2528 2529 2530
		}
	}

2531
	req->dcid   = cpu_to_le16(chan->dcid);
2532 2533 2534 2535 2536
	req->flags  = cpu_to_le16(0x0000);

	return ptr - data;
}

2537
static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data, u16 result, u16 flags)
L
Linus Torvalds 已提交
2538 2539 2540 2541
{
	struct l2cap_conf_rsp *rsp = data;
	void *ptr = rsp->data;

2542
	BT_DBG("chan %p", chan);
L
Linus Torvalds 已提交
2543

2544
	rsp->scid   = cpu_to_le16(chan->dcid);
2545
	rsp->result = cpu_to_le16(result);
2546
	rsp->flags  = cpu_to_le16(flags);
L
Linus Torvalds 已提交
2547 2548 2549 2550

	return ptr - data;
}

2551
void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
2552 2553
{
	struct l2cap_conn_rsp rsp;
2554
	struct l2cap_conn *conn = chan->conn;
2555 2556
	u8 buf[128];

2557 2558
	rsp.scid   = cpu_to_le16(chan->dcid);
	rsp.dcid   = cpu_to_le16(chan->scid);
2559 2560 2561 2562 2563
	rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
	rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
	l2cap_send_cmd(conn, chan->ident,
				L2CAP_CONN_RSP, sizeof(rsp), &rsp);

2564
	if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
2565 2566 2567 2568 2569 2570 2571
		return;

	l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
			l2cap_build_conf_req(chan, buf), buf);
	chan->num_conf_req++;
}

2572
static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
2573 2574 2575 2576 2577
{
	int type, olen;
	unsigned long val;
	struct l2cap_conf_rfc rfc;

2578
	BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
2579

2580
	if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593
		return;

	while (len >= L2CAP_CONF_OPT_SIZE) {
		len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);

		switch (type) {
		case L2CAP_CONF_RFC:
			if (olen == sizeof(rfc))
				memcpy(&rfc, (void *)val, olen);
			goto done;
		}
	}

2594 2595 2596 2597 2598 2599 2600 2601 2602 2603
	/* Use sane default values in case a misbehaving remote device
	 * did not send an RFC option.
	 */
	rfc.mode = chan->mode;
	rfc.retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
	rfc.monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
	rfc.max_pdu_size = cpu_to_le16(chan->imtu);

	BT_ERR("Expected RFC option was not found, using defaults");

2604 2605 2606
done:
	switch (rfc.mode) {
	case L2CAP_MODE_ERTM:
2607 2608 2609
		chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
		chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
		chan->mps    = le16_to_cpu(rfc.max_pdu_size);
2610 2611
		break;
	case L2CAP_MODE_STREAMING:
2612
		chan->mps    = le16_to_cpu(rfc.max_pdu_size);
2613 2614 2615
	}
}

2616 2617
static inline int l2cap_command_rej(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
{
2618
	struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
2619

2620
	if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
2621 2622 2623 2624
		return 0;

	if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
					cmd->ident == conn->info_ident) {
2625
		cancel_delayed_work(&conn->info_timer);
2626 2627

		conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
2628
		conn->info_ident = 0;
2629

2630 2631 2632 2633 2634 2635
		l2cap_conn_start(conn);
	}

	return 0;
}

L
Linus Torvalds 已提交
2636 2637 2638 2639
static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
{
	struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
	struct l2cap_conn_rsp rsp;
2640
	struct l2cap_chan *chan = NULL, *pchan;
2641
	struct sock *parent, *sk = NULL;
2642
	int result, status = L2CAP_CS_NO_INFO;
L
Linus Torvalds 已提交
2643 2644

	u16 dcid = 0, scid = __le16_to_cpu(req->scid);
2645
	__le16 psm = req->psm;
L
Linus Torvalds 已提交
2646

2647
	BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
L
Linus Torvalds 已提交
2648 2649

	/* Check if we have socket listening on psm */
2650 2651
	pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, conn->src);
	if (!pchan) {
L
Linus Torvalds 已提交
2652 2653 2654 2655
		result = L2CAP_CR_BAD_PSM;
		goto sendresp;
	}

2656 2657
	parent = pchan->sk;

2658
	mutex_lock(&conn->chan_lock);
2659
	lock_sock(parent);
2660

2661 2662 2663
	/* Check if the ACL is secure enough (if not SDP) */
	if (psm != cpu_to_le16(0x0001) &&
				!hci_conn_check_link_mode(conn->hcon)) {
2664
		conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
2665 2666 2667 2668
		result = L2CAP_CR_SEC_BLOCK;
		goto response;
	}

L
Linus Torvalds 已提交
2669 2670 2671 2672
	result = L2CAP_CR_NO_MEM;

	/* Check for backlog size */
	if (sk_acceptq_is_full(parent)) {
2673
		BT_DBG("backlog full %d", parent->sk_ack_backlog);
L
Linus Torvalds 已提交
2674 2675 2676
		goto response;
	}

2677 2678
	chan = pchan->ops->new_connection(pchan->data);
	if (!chan)
L
Linus Torvalds 已提交
2679 2680
		goto response;

2681 2682
	sk = chan->sk;

L
Linus Torvalds 已提交
2683
	/* Check if we already have channel with that dcid */
2684
	if (__l2cap_get_chan_by_dcid(conn, scid)) {
L
Linus Torvalds 已提交
2685
		sock_set_flag(sk, SOCK_ZAPPED);
2686
		chan->ops->close(chan->data);
L
Linus Torvalds 已提交
2687 2688 2689 2690 2691 2692 2693
		goto response;
	}

	hci_conn_hold(conn->hcon);

	bacpy(&bt_sk(sk)->src, conn->src);
	bacpy(&bt_sk(sk)->dst, conn->dst);
2694 2695
	chan->psm  = psm;
	chan->dcid = scid;
L
Linus Torvalds 已提交
2696

2697 2698
	bt_accept_enqueue(parent, sk);

2699
	__l2cap_chan_add(conn, chan);
2700

2701
	dcid = chan->scid;
L
Linus Torvalds 已提交
2702

2703
	__set_chan_timer(chan, sk->sk_sndtimeo);
L
Linus Torvalds 已提交
2704

2705
	chan->ident = cmd->ident;
L
Linus Torvalds 已提交
2706

2707
	if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
2708
		if (l2cap_chan_check_security(chan)) {
2709
			if (bt_sk(sk)->defer_setup) {
2710
				__l2cap_state_change(chan, BT_CONNECT2);
2711 2712 2713 2714
				result = L2CAP_CR_PEND;
				status = L2CAP_CS_AUTHOR_PEND;
				parent->sk_data_ready(parent, 0);
			} else {
2715
				__l2cap_state_change(chan, BT_CONFIG);
2716 2717 2718
				result = L2CAP_CR_SUCCESS;
				status = L2CAP_CS_NO_INFO;
			}
2719
		} else {
2720
			__l2cap_state_change(chan, BT_CONNECT2);
2721 2722 2723 2724
			result = L2CAP_CR_PEND;
			status = L2CAP_CS_AUTHEN_PEND;
		}
	} else {
2725
		__l2cap_state_change(chan, BT_CONNECT2);
2726 2727
		result = L2CAP_CR_PEND;
		status = L2CAP_CS_NO_INFO;
L
Linus Torvalds 已提交
2728 2729 2730
	}

response:
2731
	release_sock(parent);
2732
	mutex_unlock(&conn->chan_lock);
L
Linus Torvalds 已提交
2733 2734

sendresp:
2735 2736 2737 2738
	rsp.scid   = cpu_to_le16(scid);
	rsp.dcid   = cpu_to_le16(dcid);
	rsp.result = cpu_to_le16(result);
	rsp.status = cpu_to_le16(status);
L
Linus Torvalds 已提交
2739
	l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
2740 2741 2742 2743 2744 2745 2746 2747

	if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
		struct l2cap_info_req info;
		info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);

		conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
		conn->info_ident = l2cap_get_ident(conn);

2748
		schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
2749 2750 2751 2752 2753

		l2cap_send_cmd(conn, conn->info_ident,
					L2CAP_INFO_REQ, sizeof(info), &info);
	}

2754
	if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
2755 2756
				result == L2CAP_CR_SUCCESS) {
		u8 buf[128];
2757
		set_bit(CONF_REQ_SENT, &chan->conf_state);
2758
		l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
2759 2760
					l2cap_build_conf_req(chan, buf), buf);
		chan->num_conf_req++;
2761 2762
	}

L
Linus Torvalds 已提交
2763 2764 2765 2766 2767 2768 2769
	return 0;
}

static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
{
	struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
	u16 scid, dcid, result, status;
2770
	struct l2cap_chan *chan;
L
Linus Torvalds 已提交
2771
	u8 req[128];
2772
	int err;
L
Linus Torvalds 已提交
2773 2774 2775 2776 2777 2778

	scid   = __le16_to_cpu(rsp->scid);
	dcid   = __le16_to_cpu(rsp->dcid);
	result = __le16_to_cpu(rsp->result);
	status = __le16_to_cpu(rsp->status);

2779 2780
	BT_DBG("dcid 0x%4.4x scid 0x%4.4x result 0x%2.2x status 0x%2.2x",
						dcid, scid, result, status);
L
Linus Torvalds 已提交
2781

2782 2783
	mutex_lock(&conn->chan_lock);

L
Linus Torvalds 已提交
2784
	if (scid) {
2785 2786 2787 2788 2789
		chan = __l2cap_get_chan_by_scid(conn, scid);
		if (!chan) {
			err = -EFAULT;
			goto unlock;
		}
L
Linus Torvalds 已提交
2790
	} else {
2791 2792 2793 2794 2795
		chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
		if (!chan) {
			err = -EFAULT;
			goto unlock;
		}
L
Linus Torvalds 已提交
2796 2797
	}

2798 2799
	err = 0;

2800
	l2cap_chan_lock(chan);
2801

L
Linus Torvalds 已提交
2802 2803
	switch (result) {
	case L2CAP_CR_SUCCESS:
2804
		l2cap_state_change(chan, BT_CONFIG);
2805
		chan->ident = 0;
2806
		chan->dcid = dcid;
2807
		clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
2808

2809
		if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
2810 2811
			break;

L
Linus Torvalds 已提交
2812
		l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
2813 2814
					l2cap_build_conf_req(chan, req), req);
		chan->num_conf_req++;
L
Linus Torvalds 已提交
2815 2816 2817
		break;

	case L2CAP_CR_PEND:
2818
		set_bit(CONF_CONNECT_PEND, &chan->conf_state);
L
Linus Torvalds 已提交
2819 2820 2821
		break;

	default:
2822
		l2cap_chan_del(chan, ECONNREFUSED);
L
Linus Torvalds 已提交
2823 2824 2825
		break;
	}

2826
	l2cap_chan_unlock(chan);
2827 2828 2829 2830 2831

unlock:
	mutex_unlock(&conn->chan_lock);

	return err;
L
Linus Torvalds 已提交
2832 2833
}

2834
static inline void set_default_fcs(struct l2cap_chan *chan)
2835 2836 2837 2838
{
	/* FCS is enabled only in ERTM or streaming mode, if one or both
	 * sides request it.
	 */
2839
	if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
2840
		chan->fcs = L2CAP_FCS_NONE;
2841
	else if (!test_bit(CONF_NO_FCS_RECV, &chan->conf_state))
2842
		chan->fcs = L2CAP_FCS_CRC16;
2843 2844
}

2845
static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
L
Linus Torvalds 已提交
2846 2847 2848 2849
{
	struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
	u16 dcid, flags;
	u8 rsp[64];
2850
	struct l2cap_chan *chan;
2851
	int len;
L
Linus Torvalds 已提交
2852 2853 2854 2855 2856 2857

	dcid  = __le16_to_cpu(req->dcid);
	flags = __le16_to_cpu(req->flags);

	BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);

2858
	chan = l2cap_get_chan_by_scid(conn, dcid);
2859
	if (!chan)
L
Linus Torvalds 已提交
2860 2861
		return -ENOENT;

2862
	l2cap_chan_lock(chan);
2863

2864
	if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
2865 2866 2867 2868 2869
		struct l2cap_cmd_rej_cid rej;

		rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
		rej.scid = cpu_to_le16(chan->scid);
		rej.dcid = cpu_to_le16(chan->dcid);
2870 2871 2872

		l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
				sizeof(rej), &rej);
2873
		goto unlock;
2874
	}
2875

2876
	/* Reject if config buffer is too small. */
2877
	len = cmd_len - sizeof(*req);
2878
	if (len < 0 || chan->conf_len + len > sizeof(chan->conf_req)) {
2879
		l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
2880
				l2cap_build_conf_rsp(chan, rsp,
2881 2882 2883 2884 2885
					L2CAP_CONF_REJECT, flags), rsp);
		goto unlock;
	}

	/* Store config. */
2886 2887
	memcpy(chan->conf_req + chan->conf_len, req->data, len);
	chan->conf_len += len;
L
Linus Torvalds 已提交
2888 2889 2890 2891

	if (flags & 0x0001) {
		/* Incomplete config. Send empty response. */
		l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
2892
				l2cap_build_conf_rsp(chan, rsp,
2893
					L2CAP_CONF_SUCCESS, 0x0001), rsp);
L
Linus Torvalds 已提交
2894 2895 2896 2897
		goto unlock;
	}

	/* Complete config. */
2898
	len = l2cap_parse_conf_req(chan, rsp);
2899
	if (len < 0) {
2900
		l2cap_send_disconn_req(conn, chan, ECONNRESET);
L
Linus Torvalds 已提交
2901
		goto unlock;
2902
	}
L
Linus Torvalds 已提交
2903

2904
	l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
2905
	chan->num_conf_rsp++;
2906 2907

	/* Reset config buffer. */
2908
	chan->conf_len = 0;
2909

2910
	if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
2911 2912
		goto unlock;

2913
	if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
2914
		set_default_fcs(chan);
2915

2916
		l2cap_state_change(chan, BT_CONNECTED);
2917

2918 2919
		chan->next_tx_seq = 0;
		chan->expected_tx_seq = 0;
2920
		skb_queue_head_init(&chan->tx_q);
2921
		if (chan->mode == L2CAP_MODE_ERTM)
2922
			l2cap_ertm_init(chan);
2923

2924
		l2cap_chan_ready(chan);
2925 2926 2927
		goto unlock;
	}

2928
	if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
2929
		u8 buf[64];
L
Linus Torvalds 已提交
2930
		l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
2931 2932
					l2cap_build_conf_req(chan, buf), buf);
		chan->num_conf_req++;
L
Linus Torvalds 已提交
2933 2934
	}

2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945
	/* Got Conf Rsp PENDING from remote side and asume we sent
	   Conf Rsp PENDING in the code above */
	if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
			test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {

		/* check compatibility */

		clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
		set_bit(CONF_OUTPUT_DONE, &chan->conf_state);

		l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
2946
					l2cap_build_conf_rsp(chan, rsp,
2947 2948 2949
					L2CAP_CONF_SUCCESS, 0x0000), rsp);
	}

L
Linus Torvalds 已提交
2950
unlock:
2951
	l2cap_chan_unlock(chan);
L
Linus Torvalds 已提交
2952 2953 2954 2955 2956 2957 2958
	return 0;
}

static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
{
	struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
	u16 scid, flags, result;
2959
	struct l2cap_chan *chan;
2960
	int len = le16_to_cpu(cmd->len) - sizeof(*rsp);
L
Linus Torvalds 已提交
2961 2962 2963 2964 2965

	scid   = __le16_to_cpu(rsp->scid);
	flags  = __le16_to_cpu(rsp->flags);
	result = __le16_to_cpu(rsp->result);

2966 2967
	BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
	       result, len);
L
Linus Torvalds 已提交
2968

2969
	chan = l2cap_get_chan_by_scid(conn, scid);
2970
	if (!chan)
L
Linus Torvalds 已提交
2971 2972
		return 0;

2973
	l2cap_chan_lock(chan);
2974

L
Linus Torvalds 已提交
2975 2976
	switch (result) {
	case L2CAP_CONF_SUCCESS:
2977
		l2cap_conf_rfc_get(chan, rsp->data, len);
2978
		clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
L
Linus Torvalds 已提交
2979 2980
		break;

2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999
	case L2CAP_CONF_PENDING:
		set_bit(CONF_REM_CONF_PEND, &chan->conf_state);

		if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
			char buf[64];

			len = l2cap_parse_conf_rsp(chan, rsp->data, len,
								buf, &result);
			if (len < 0) {
				l2cap_send_disconn_req(conn, chan, ECONNRESET);
				goto done;
			}

			/* check compatibility */

			clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
			set_bit(CONF_OUTPUT_DONE, &chan->conf_state);

			l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
3000
						l2cap_build_conf_rsp(chan, buf,
3001 3002 3003 3004
						L2CAP_CONF_SUCCESS, 0x0000), buf);
		}
		goto done;

L
Linus Torvalds 已提交
3005
	case L2CAP_CONF_UNACCEPT:
3006
		if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
3007 3008
			char req[64];

3009
			if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
3010
				l2cap_send_disconn_req(conn, chan, ECONNRESET);
3011 3012 3013
				goto done;
			}

3014 3015
			/* throw out any old stored conf requests */
			result = L2CAP_CONF_SUCCESS;
3016 3017
			len = l2cap_parse_conf_rsp(chan, rsp->data, len,
								req, &result);
3018
			if (len < 0) {
3019
				l2cap_send_disconn_req(conn, chan, ECONNRESET);
3020 3021 3022 3023 3024
				goto done;
			}

			l2cap_send_cmd(conn, l2cap_get_ident(conn),
						L2CAP_CONF_REQ, len, req);
3025
			chan->num_conf_req++;
3026 3027 3028
			if (result != L2CAP_CONF_SUCCESS)
				goto done;
			break;
L
Linus Torvalds 已提交
3029 3030
		}

3031
	default:
3032
		l2cap_chan_set_err(chan, ECONNRESET);
3033

3034
		__set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
3035
		l2cap_send_disconn_req(conn, chan, ECONNRESET);
L
Linus Torvalds 已提交
3036 3037 3038 3039 3040 3041
		goto done;
	}

	if (flags & 0x01)
		goto done;

3042
	set_bit(CONF_INPUT_DONE, &chan->conf_state);
L
Linus Torvalds 已提交
3043

3044
	if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
3045
		set_default_fcs(chan);
3046

3047
		l2cap_state_change(chan, BT_CONNECTED);
3048 3049
		chan->next_tx_seq = 0;
		chan->expected_tx_seq = 0;
3050
		skb_queue_head_init(&chan->tx_q);
3051
		if (chan->mode ==  L2CAP_MODE_ERTM)
3052
			l2cap_ertm_init(chan);
3053

3054
		l2cap_chan_ready(chan);
L
Linus Torvalds 已提交
3055 3056 3057
	}

done:
3058
	l2cap_chan_unlock(chan);
L
Linus Torvalds 已提交
3059 3060 3061 3062 3063 3064 3065 3066
	return 0;
}

static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
{
	struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
	struct l2cap_disconn_rsp rsp;
	u16 dcid, scid;
3067
	struct l2cap_chan *chan;
L
Linus Torvalds 已提交
3068 3069 3070 3071 3072 3073 3074
	struct sock *sk;

	scid = __le16_to_cpu(req->scid);
	dcid = __le16_to_cpu(req->dcid);

	BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);

3075 3076 3077 3078 3079
	mutex_lock(&conn->chan_lock);

	chan = __l2cap_get_chan_by_scid(conn, dcid);
	if (!chan) {
		mutex_unlock(&conn->chan_lock);
L
Linus Torvalds 已提交
3080
		return 0;
3081
	}
L
Linus Torvalds 已提交
3082

3083 3084
	l2cap_chan_lock(chan);

3085 3086
	sk = chan->sk;

3087 3088
	rsp.dcid = cpu_to_le16(chan->scid);
	rsp.scid = cpu_to_le16(chan->dcid);
L
Linus Torvalds 已提交
3089 3090
	l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);

3091
	lock_sock(sk);
L
Linus Torvalds 已提交
3092
	sk->sk_shutdown = SHUTDOWN_MASK;
3093
	release_sock(sk);
L
Linus Torvalds 已提交
3094

3095
	l2cap_chan_del(chan, ECONNRESET);
3096 3097

	l2cap_chan_unlock(chan);
L
Linus Torvalds 已提交
3098

3099
	chan->ops->close(chan->data);
3100 3101 3102

	mutex_unlock(&conn->chan_lock);

L
Linus Torvalds 已提交
3103 3104 3105 3106 3107 3108 3109
	return 0;
}

static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
{
	struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
	u16 dcid, scid;
3110
	struct l2cap_chan *chan;
L
Linus Torvalds 已提交
3111 3112 3113 3114 3115 3116

	scid = __le16_to_cpu(rsp->scid);
	dcid = __le16_to_cpu(rsp->dcid);

	BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);

3117 3118 3119 3120 3121
	mutex_lock(&conn->chan_lock);

	chan = __l2cap_get_chan_by_scid(conn, scid);
	if (!chan) {
		mutex_unlock(&conn->chan_lock);
L
Linus Torvalds 已提交
3122
		return 0;
3123
	}
L
Linus Torvalds 已提交
3124

3125
	l2cap_chan_lock(chan);
3126 3127

	l2cap_chan_del(chan, 0);
3128 3129

	l2cap_chan_unlock(chan);
L
Linus Torvalds 已提交
3130

3131
	chan->ops->close(chan->data);
3132 3133 3134

	mutex_unlock(&conn->chan_lock);

L
Linus Torvalds 已提交
3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146
	return 0;
}

static inline int l2cap_information_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
{
	struct l2cap_info_req *req = (struct l2cap_info_req *) data;
	u16 type;

	type = __le16_to_cpu(req->type);

	BT_DBG("type 0x%4.4x", type);

3147 3148
	if (type == L2CAP_IT_FEAT_MASK) {
		u8 buf[8];
3149
		u32 feat_mask = l2cap_feat_mask;
3150 3151 3152
		struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
		rsp->type   = cpu_to_le16(L2CAP_IT_FEAT_MASK);
		rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
3153
		if (!disable_ertm)
3154 3155
			feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
							 | L2CAP_FEAT_FCS;
3156
		if (enable_hs)
3157 3158
			feat_mask |= L2CAP_FEAT_EXT_FLOW
						| L2CAP_FEAT_EXT_WINDOW;
3159

3160
		put_unaligned_le32(feat_mask, rsp->data);
3161 3162
		l2cap_send_cmd(conn, cmd->ident,
					L2CAP_INFO_RSP, sizeof(buf), buf);
3163 3164 3165
	} else if (type == L2CAP_IT_FIXED_CHAN) {
		u8 buf[12];
		struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
3166 3167 3168 3169 3170 3171

		if (enable_hs)
			l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
		else
			l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;

3172 3173
		rsp->type   = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
		rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
3174
		memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
3175 3176
		l2cap_send_cmd(conn, cmd->ident,
					L2CAP_INFO_RSP, sizeof(buf), buf);
3177 3178 3179 3180 3181 3182 3183
	} else {
		struct l2cap_info_rsp rsp;
		rsp.type   = cpu_to_le16(type);
		rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
		l2cap_send_cmd(conn, cmd->ident,
					L2CAP_INFO_RSP, sizeof(rsp), &rsp);
	}
L
Linus Torvalds 已提交
3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197

	return 0;
}

static inline int l2cap_information_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
{
	struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
	u16 type, result;

	type   = __le16_to_cpu(rsp->type);
	result = __le16_to_cpu(rsp->result);

	BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);

3198 3199 3200 3201 3202
	/* L2CAP Info req/rsp are unbound to channels, add extra checks */
	if (cmd->ident != conn->info_ident ||
			conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
		return 0;

3203
	cancel_delayed_work(&conn->info_timer);
3204

3205 3206 3207 3208 3209 3210 3211 3212 3213
	if (result != L2CAP_IR_SUCCESS) {
		conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
		conn->info_ident = 0;

		l2cap_conn_start(conn);

		return 0;
	}

3214 3215
	switch (type) {
	case L2CAP_IT_FEAT_MASK:
3216
		conn->feat_mask = get_unaligned_le32(rsp->data);
3217

3218
		if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231
			struct l2cap_info_req req;
			req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);

			conn->info_ident = l2cap_get_ident(conn);

			l2cap_send_cmd(conn, conn->info_ident,
					L2CAP_INFO_REQ, sizeof(req), &req);
		} else {
			conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
			conn->info_ident = 0;

			l2cap_conn_start(conn);
		}
3232 3233 3234 3235
		break;

	case L2CAP_IT_FIXED_CHAN:
		conn->fixed_chan_mask = rsp->data[0];
3236
		conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
3237
		conn->info_ident = 0;
3238 3239

		l2cap_conn_start(conn);
3240
		break;
3241
	}
3242

L
Linus Torvalds 已提交
3243 3244 3245
	return 0;
}

3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267
static inline int l2cap_create_channel_req(struct l2cap_conn *conn,
					struct l2cap_cmd_hdr *cmd, u16 cmd_len,
					void *data)
{
	struct l2cap_create_chan_req *req = data;
	struct l2cap_create_chan_rsp rsp;
	u16 psm, scid;

	if (cmd_len != sizeof(*req))
		return -EPROTO;

	if (!enable_hs)
		return -EINVAL;

	psm = le16_to_cpu(req->psm);
	scid = le16_to_cpu(req->scid);

	BT_DBG("psm %d, scid %d, amp_id %d", psm, scid, req->amp_id);

	/* Placeholder: Always reject */
	rsp.dcid = 0;
	rsp.scid = cpu_to_le16(scid);
3268 3269
	rsp.result = __constant_cpu_to_le16(L2CAP_CR_NO_MEM);
	rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284

	l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
		       sizeof(rsp), &rsp);

	return 0;
}

static inline int l2cap_create_channel_rsp(struct l2cap_conn *conn,
					struct l2cap_cmd_hdr *cmd, void *data)
{
	BT_DBG("conn %p", conn);

	return l2cap_connect_rsp(conn, cmd, data);
}

3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404
static void l2cap_send_move_chan_rsp(struct l2cap_conn *conn, u8 ident,
							u16 icid, u16 result)
{
	struct l2cap_move_chan_rsp rsp;

	BT_DBG("icid %d, result %d", icid, result);

	rsp.icid = cpu_to_le16(icid);
	rsp.result = cpu_to_le16(result);

	l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_RSP, sizeof(rsp), &rsp);
}

static void l2cap_send_move_chan_cfm(struct l2cap_conn *conn,
				struct l2cap_chan *chan, u16 icid, u16 result)
{
	struct l2cap_move_chan_cfm cfm;
	u8 ident;

	BT_DBG("icid %d, result %d", icid, result);

	ident = l2cap_get_ident(conn);
	if (chan)
		chan->ident = ident;

	cfm.icid = cpu_to_le16(icid);
	cfm.result = cpu_to_le16(result);

	l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM, sizeof(cfm), &cfm);
}

static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
								u16 icid)
{
	struct l2cap_move_chan_cfm_rsp rsp;

	BT_DBG("icid %d", icid);

	rsp.icid = cpu_to_le16(icid);
	l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
}

static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
			struct l2cap_cmd_hdr *cmd, u16 cmd_len, void *data)
{
	struct l2cap_move_chan_req *req = data;
	u16 icid = 0;
	u16 result = L2CAP_MR_NOT_ALLOWED;

	if (cmd_len != sizeof(*req))
		return -EPROTO;

	icid = le16_to_cpu(req->icid);

	BT_DBG("icid %d, dest_amp_id %d", icid, req->dest_amp_id);

	if (!enable_hs)
		return -EINVAL;

	/* Placeholder: Always refuse */
	l2cap_send_move_chan_rsp(conn, cmd->ident, icid, result);

	return 0;
}

static inline int l2cap_move_channel_rsp(struct l2cap_conn *conn,
			struct l2cap_cmd_hdr *cmd, u16 cmd_len, void *data)
{
	struct l2cap_move_chan_rsp *rsp = data;
	u16 icid, result;

	if (cmd_len != sizeof(*rsp))
		return -EPROTO;

	icid = le16_to_cpu(rsp->icid);
	result = le16_to_cpu(rsp->result);

	BT_DBG("icid %d, result %d", icid, result);

	/* Placeholder: Always unconfirmed */
	l2cap_send_move_chan_cfm(conn, NULL, icid, L2CAP_MC_UNCONFIRMED);

	return 0;
}

static inline int l2cap_move_channel_confirm(struct l2cap_conn *conn,
			struct l2cap_cmd_hdr *cmd, u16 cmd_len, void *data)
{
	struct l2cap_move_chan_cfm *cfm = data;
	u16 icid, result;

	if (cmd_len != sizeof(*cfm))
		return -EPROTO;

	icid = le16_to_cpu(cfm->icid);
	result = le16_to_cpu(cfm->result);

	BT_DBG("icid %d, result %d", icid, result);

	l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);

	return 0;
}

static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
			struct l2cap_cmd_hdr *cmd, u16 cmd_len, void *data)
{
	struct l2cap_move_chan_cfm_rsp *rsp = data;
	u16 icid;

	if (cmd_len != sizeof(*rsp))
		return -EPROTO;

	icid = le16_to_cpu(rsp->icid);

	BT_DBG("icid %d", icid);

	return 0;
}

3405
static inline int l2cap_check_conn_param(u16 min, u16 max, u16 latency,
3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432
							u16 to_multiplier)
{
	u16 max_latency;

	if (min > max || min < 6 || max > 3200)
		return -EINVAL;

	if (to_multiplier < 10 || to_multiplier > 3200)
		return -EINVAL;

	if (max >= to_multiplier * 8)
		return -EINVAL;

	max_latency = (to_multiplier * 8 / max) - 1;
	if (latency > 499 || latency > max_latency)
		return -EINVAL;

	return 0;
}

static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
					struct l2cap_cmd_hdr *cmd, u8 *data)
{
	struct hci_conn *hcon = conn->hcon;
	struct l2cap_conn_param_update_req *req;
	struct l2cap_conn_param_update_rsp rsp;
	u16 min, max, latency, to_multiplier, cmd_len;
3433
	int err;
3434 3435 3436 3437 3438 3439 3440 3441 3442

	if (!(hcon->link_mode & HCI_LM_MASTER))
		return -EINVAL;

	cmd_len = __le16_to_cpu(cmd->len);
	if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
		return -EPROTO;

	req = (struct l2cap_conn_param_update_req *) data;
3443 3444
	min		= __le16_to_cpu(req->min);
	max		= __le16_to_cpu(req->max);
3445 3446 3447 3448 3449 3450 3451
	latency		= __le16_to_cpu(req->latency);
	to_multiplier	= __le16_to_cpu(req->to_multiplier);

	BT_DBG("min 0x%4.4x max 0x%4.4x latency: 0x%4.4x Timeout: 0x%4.4x",
						min, max, latency, to_multiplier);

	memset(&rsp, 0, sizeof(rsp));
3452 3453 3454

	err = l2cap_check_conn_param(min, max, latency, to_multiplier);
	if (err)
3455 3456 3457 3458 3459 3460 3461
		rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
	else
		rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);

	l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
							sizeof(rsp), &rsp);

3462 3463 3464
	if (!err)
		hci_le_conn_update(hcon, min, max, latency, to_multiplier);

3465 3466 3467
	return 0;
}

3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516
static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
			struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
{
	int err = 0;

	switch (cmd->code) {
	case L2CAP_COMMAND_REJ:
		l2cap_command_rej(conn, cmd, data);
		break;

	case L2CAP_CONN_REQ:
		err = l2cap_connect_req(conn, cmd, data);
		break;

	case L2CAP_CONN_RSP:
		err = l2cap_connect_rsp(conn, cmd, data);
		break;

	case L2CAP_CONF_REQ:
		err = l2cap_config_req(conn, cmd, cmd_len, data);
		break;

	case L2CAP_CONF_RSP:
		err = l2cap_config_rsp(conn, cmd, data);
		break;

	case L2CAP_DISCONN_REQ:
		err = l2cap_disconnect_req(conn, cmd, data);
		break;

	case L2CAP_DISCONN_RSP:
		err = l2cap_disconnect_rsp(conn, cmd, data);
		break;

	case L2CAP_ECHO_REQ:
		l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
		break;

	case L2CAP_ECHO_RSP:
		break;

	case L2CAP_INFO_REQ:
		err = l2cap_information_req(conn, cmd, data);
		break;

	case L2CAP_INFO_RSP:
		err = l2cap_information_rsp(conn, cmd, data);
		break;

3517 3518 3519 3520 3521 3522 3523 3524
	case L2CAP_CREATE_CHAN_REQ:
		err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
		break;

	case L2CAP_CREATE_CHAN_RSP:
		err = l2cap_create_channel_rsp(conn, cmd, data);
		break;

3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540
	case L2CAP_MOVE_CHAN_REQ:
		err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
		break;

	case L2CAP_MOVE_CHAN_RSP:
		err = l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
		break;

	case L2CAP_MOVE_CHAN_CFM:
		err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
		break;

	case L2CAP_MOVE_CHAN_CFM_RSP:
		err = l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
		break;

3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557
	default:
		BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
		err = -EINVAL;
		break;
	}

	return err;
}

static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
					struct l2cap_cmd_hdr *cmd, u8 *data)
{
	switch (cmd->code) {
	case L2CAP_COMMAND_REJ:
		return 0;

	case L2CAP_CONN_PARAM_UPDATE_REQ:
3558
		return l2cap_conn_param_update_req(conn, cmd, data);
3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570

	case L2CAP_CONN_PARAM_UPDATE_RSP:
		return 0;

	default:
		BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
		return -EINVAL;
	}
}

static inline void l2cap_sig_channel(struct l2cap_conn *conn,
							struct sk_buff *skb)
L
Linus Torvalds 已提交
3571 3572 3573 3574
{
	u8 *data = skb->data;
	int len = skb->len;
	struct l2cap_cmd_hdr cmd;
3575
	int err;
L
Linus Torvalds 已提交
3576 3577 3578 3579

	l2cap_raw_recv(conn, skb);

	while (len >= L2CAP_CMD_HDR_SIZE) {
3580
		u16 cmd_len;
L
Linus Torvalds 已提交
3581 3582 3583 3584
		memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
		data += L2CAP_CMD_HDR_SIZE;
		len  -= L2CAP_CMD_HDR_SIZE;

3585
		cmd_len = le16_to_cpu(cmd.len);
L
Linus Torvalds 已提交
3586

3587
		BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len, cmd.ident);
L
Linus Torvalds 已提交
3588

3589
		if (cmd_len > len || !cmd.ident) {
L
Linus Torvalds 已提交
3590 3591 3592 3593
			BT_DBG("corrupted command");
			break;
		}

3594 3595 3596 3597
		if (conn->hcon->type == LE_LINK)
			err = l2cap_le_sig_cmd(conn, &cmd, data);
		else
			err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
L
Linus Torvalds 已提交
3598 3599

		if (err) {
3600
			struct l2cap_cmd_rej_unk rej;
3601 3602

			BT_ERR("Wrong link type (%d)", err);
L
Linus Torvalds 已提交
3603 3604

			/* FIXME: Map err to a valid reason */
3605
			rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
L
Linus Torvalds 已提交
3606 3607 3608
			l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
		}

3609 3610
		data += cmd_len;
		len  -= cmd_len;
L
Linus Torvalds 已提交
3611 3612 3613 3614 3615
	}

	kfree_skb(skb);
}

3616
static int l2cap_check_fcs(struct l2cap_chan *chan,  struct sk_buff *skb)
3617 3618
{
	u16 our_fcs, rcv_fcs;
3619 3620 3621 3622 3623 3624
	int hdr_size;

	if (test_bit(FLAG_EXT_CTRL, &chan->flags))
		hdr_size = L2CAP_EXT_HDR_SIZE;
	else
		hdr_size = L2CAP_ENH_HDR_SIZE;
3625

3626
	if (chan->fcs == L2CAP_FCS_CRC16) {
3627
		skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
3628 3629 3630 3631
		rcv_fcs = get_unaligned_le16(skb->data + skb->len);
		our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);

		if (our_fcs != rcv_fcs)
3632
			return -EBADMSG;
3633 3634 3635 3636
	}
	return 0;
}

3637
static inline void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
3638
{
3639
	u32 control = 0;
3640

3641
	chan->frames_sent = 0;
3642

3643
	control |= __set_reqseq(chan, chan->buffer_seq);
3644

3645
	if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
3646
		control |= __set_ctrl_super(chan, L2CAP_SUPER_RNR);
3647
		l2cap_send_sframe(chan, control);
3648
		set_bit(CONN_RNR_SENT, &chan->conn_state);
3649 3650
	}

3651
	if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
3652
		l2cap_retransmit_frames(chan);
3653

3654
	l2cap_ertm_send(chan);
3655

3656
	if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
3657
			chan->frames_sent == 0) {
3658
		control |= __set_ctrl_super(chan, L2CAP_SUPER_RR);
3659
		l2cap_send_sframe(chan, control);
3660 3661 3662
	}
}

3663
static int l2cap_add_to_srej_queue(struct l2cap_chan *chan, struct sk_buff *skb, u16 tx_seq, u8 sar)
3664 3665
{
	struct sk_buff *next_skb;
3666
	int tx_seq_offset, next_tx_seq_offset;
3667 3668 3669 3670

	bt_cb(skb)->tx_seq = tx_seq;
	bt_cb(skb)->sar = sar;

3671
	next_skb = skb_peek(&chan->srej_q);
3672

3673
	tx_seq_offset = __seq_offset(chan, tx_seq, chan->buffer_seq);
3674

3675
	while (next_skb) {
3676 3677 3678
		if (bt_cb(next_skb)->tx_seq == tx_seq)
			return -EINVAL;

3679 3680
		next_tx_seq_offset = __seq_offset(chan,
				bt_cb(next_skb)->tx_seq, chan->buffer_seq);
3681 3682

		if (next_tx_seq_offset > tx_seq_offset) {
3683
			__skb_queue_before(&chan->srej_q, next_skb, skb);
3684
			return 0;
3685 3686
		}

3687
		if (skb_queue_is_last(&chan->srej_q, next_skb))
3688 3689 3690 3691
			next_skb = NULL;
		else
			next_skb = skb_queue_next(&chan->srej_q, next_skb);
	}
3692

3693
	__skb_queue_tail(&chan->srej_q, skb);
3694 3695

	return 0;
3696 3697
}

3698 3699
static void append_skb_frag(struct sk_buff *skb,
			struct sk_buff *new_frag, struct sk_buff **last_frag)
3700
{
3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716
	/* skb->len reflects data in skb as well as all fragments
	 * skb->data_len reflects only data in fragments
	 */
	if (!skb_has_frag_list(skb))
		skb_shinfo(skb)->frag_list = new_frag;

	new_frag->next = NULL;

	(*last_frag)->next = new_frag;
	*last_frag = new_frag;

	skb->len += new_frag->len;
	skb->data_len += new_frag->len;
	skb->truesize += new_frag->truesize;
}

3717
static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb, u32 control)
3718 3719
{
	int err = -EINVAL;
3720

3721 3722
	switch (__get_ctrl_sar(chan, control)) {
	case L2CAP_SAR_UNSEGMENTED:
3723 3724
		if (chan->sdu)
			break;
3725

3726 3727
		err = chan->ops->recv(chan->data, skb);
		break;
3728

3729
	case L2CAP_SAR_START:
3730 3731
		if (chan->sdu)
			break;
3732

3733
		chan->sdu_len = get_unaligned_le16(skb->data);
3734
		skb_pull(skb, L2CAP_SDULEN_SIZE);
3735

3736 3737 3738 3739
		if (chan->sdu_len > chan->imtu) {
			err = -EMSGSIZE;
			break;
		}
3740

3741 3742
		if (skb->len >= chan->sdu_len)
			break;
3743

3744 3745
		chan->sdu = skb;
		chan->sdu_last_frag = skb;
3746

3747 3748
		skb = NULL;
		err = 0;
3749 3750
		break;

3751
	case L2CAP_SAR_CONTINUE:
3752
		if (!chan->sdu)
3753
			break;
3754

3755 3756 3757
		append_skb_frag(chan->sdu, skb,
				&chan->sdu_last_frag);
		skb = NULL;
3758

3759 3760
		if (chan->sdu->len >= chan->sdu_len)
			break;
3761

3762
		err = 0;
3763 3764
		break;

3765
	case L2CAP_SAR_END:
3766
		if (!chan->sdu)
3767
			break;
3768

3769 3770 3771
		append_skb_frag(chan->sdu, skb,
				&chan->sdu_last_frag);
		skb = NULL;
3772

3773 3774
		if (chan->sdu->len != chan->sdu_len)
			break;
3775

3776
		err = chan->ops->recv(chan->data, chan->sdu);
3777

3778 3779 3780 3781 3782
		if (!err) {
			/* Reassembly complete */
			chan->sdu = NULL;
			chan->sdu_last_frag = NULL;
			chan->sdu_len = 0;
3783
		}
3784 3785 3786
		break;
	}

3787 3788 3789 3790 3791 3792 3793
	if (err) {
		kfree_skb(skb);
		kfree_skb(chan->sdu);
		chan->sdu = NULL;
		chan->sdu_last_frag = NULL;
		chan->sdu_len = 0;
	}
3794

3795
	return err;
3796 3797
}

3798
static void l2cap_ertm_enter_local_busy(struct l2cap_chan *chan)
3799
{
3800
	BT_DBG("chan %p, Enter local busy", chan);
3801

3802 3803
	set_bit(CONN_LOCAL_BUSY, &chan->conn_state);

3804
	__set_ack_timer(chan);
3805 3806 3807 3808
}

static void l2cap_ertm_exit_local_busy(struct l2cap_chan *chan)
{
3809
	u32 control;
3810

3811
	if (!test_bit(CONN_RNR_SENT, &chan->conn_state))
3812 3813
		goto done;

3814
	control = __set_reqseq(chan, chan->buffer_seq);
3815
	control |= __set_ctrl_poll(chan);
3816
	control |= __set_ctrl_super(chan, L2CAP_SUPER_RR);
3817
	l2cap_send_sframe(chan, control);
3818
	chan->retry_count = 1;
3819

3820 3821
	__clear_retrans_timer(chan);
	__set_monitor_timer(chan);
3822

3823
	set_bit(CONN_WAIT_F, &chan->conn_state);
3824 3825

done:
3826 3827
	clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
	clear_bit(CONN_RNR_SENT, &chan->conn_state);
3828

3829
	BT_DBG("chan %p, Exit local busy", chan);
3830 3831
}

3832
void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
3833
{
3834 3835 3836 3837 3838
	if (chan->mode == L2CAP_MODE_ERTM) {
		if (busy)
			l2cap_ertm_enter_local_busy(chan);
		else
			l2cap_ertm_exit_local_busy(chan);
3839 3840 3841
	}
}

3842
static void l2cap_check_srej_gap(struct l2cap_chan *chan, u16 tx_seq)
3843 3844
{
	struct sk_buff *skb;
3845
	u32 control;
3846

3847 3848 3849 3850
	while ((skb = skb_peek(&chan->srej_q)) &&
			!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
		int err;

3851 3852 3853
		if (bt_cb(skb)->tx_seq != tx_seq)
			break;

3854
		skb = skb_dequeue(&chan->srej_q);
3855
		control = __set_ctrl_sar(chan, bt_cb(skb)->sar);
3856
		err = l2cap_reassemble_sdu(chan, skb, control);
3857 3858 3859 3860 3861 3862

		if (err < 0) {
			l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
			break;
		}

3863 3864
		chan->buffer_seq_srej = __next_seq(chan, chan->buffer_seq_srej);
		tx_seq = __next_seq(chan, tx_seq);
3865 3866 3867
	}
}

3868
static void l2cap_resend_srejframe(struct l2cap_chan *chan, u16 tx_seq)
3869 3870
{
	struct srej_list *l, *tmp;
3871
	u32 control;
3872

3873
	list_for_each_entry_safe(l, tmp, &chan->srej_l, list) {
3874 3875 3876 3877 3878
		if (l->tx_seq == tx_seq) {
			list_del(&l->list);
			kfree(l);
			return;
		}
3879
		control = __set_ctrl_super(chan, L2CAP_SUPER_SREJ);
3880
		control |= __set_reqseq(chan, l->tx_seq);
3881
		l2cap_send_sframe(chan, control);
3882
		list_del(&l->list);
3883
		list_add_tail(&l->list, &chan->srej_l);
3884 3885 3886
	}
}

3887
static int l2cap_send_srejframe(struct l2cap_chan *chan, u16 tx_seq)
3888 3889
{
	struct srej_list *new;
3890
	u32 control;
3891

3892
	while (tx_seq != chan->expected_tx_seq) {
3893
		control = __set_ctrl_super(chan, L2CAP_SUPER_SREJ);
3894
		control |= __set_reqseq(chan, chan->expected_tx_seq);
3895
		l2cap_send_sframe(chan, control);
3896 3897

		new = kzalloc(sizeof(struct srej_list), GFP_ATOMIC);
3898 3899 3900
		if (!new)
			return -ENOMEM;

3901
		new->tx_seq = chan->expected_tx_seq;
3902 3903 3904

		chan->expected_tx_seq = __next_seq(chan, chan->expected_tx_seq);

3905
		list_add_tail(&new->list, &chan->srej_l);
3906
	}
3907 3908

	chan->expected_tx_seq = __next_seq(chan, chan->expected_tx_seq);
3909 3910

	return 0;
3911 3912
}

3913
static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u32 rx_control, struct sk_buff *skb)
3914
{
3915
	u16 tx_seq = __get_txseq(chan, rx_control);
3916
	u16 req_seq = __get_reqseq(chan, rx_control);
3917
	u8 sar = __get_ctrl_sar(chan, rx_control);
3918
	int tx_seq_offset, expected_tx_seq_offset;
3919
	int num_to_ack = (chan->tx_win/6) + 1;
3920 3921
	int err = 0;

3922
	BT_DBG("chan %p len %d tx_seq %d rx_control 0x%8.8x", chan, skb->len,
3923
							tx_seq, rx_control);
3924

3925
	if (__is_ctrl_final(chan, rx_control) &&
3926
			test_bit(CONN_WAIT_F, &chan->conn_state)) {
3927
		__clear_monitor_timer(chan);
3928
		if (chan->unacked_frames > 0)
3929
			__set_retrans_timer(chan);
3930
		clear_bit(CONN_WAIT_F, &chan->conn_state);
3931 3932
	}

3933 3934
	chan->expected_ack_seq = req_seq;
	l2cap_drop_acked_frames(chan);
3935

3936
	tx_seq_offset = __seq_offset(chan, tx_seq, chan->buffer_seq);
3937 3938

	/* invalid tx_seq */
3939
	if (tx_seq_offset >= chan->tx_win) {
3940
		l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
3941 3942 3943
		goto drop;
	}

3944 3945 3946
	if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
		if (!test_bit(CONN_RNR_SENT, &chan->conn_state))
			l2cap_send_ack(chan);
3947
		goto drop;
3948
	}
3949

3950 3951 3952
	if (tx_seq == chan->expected_tx_seq)
		goto expected;

3953
	if (test_bit(CONN_SREJ_SENT, &chan->conn_state)) {
3954
		struct srej_list *first;
3955

3956
		first = list_first_entry(&chan->srej_l,
3957 3958
				struct srej_list, list);
		if (tx_seq == first->tx_seq) {
3959
			l2cap_add_to_srej_queue(chan, skb, tx_seq, sar);
3960
			l2cap_check_srej_gap(chan, tx_seq);
3961 3962 3963 3964

			list_del(&first->list);
			kfree(first);

3965
			if (list_empty(&chan->srej_l)) {
3966
				chan->buffer_seq = chan->buffer_seq_srej;
3967
				clear_bit(CONN_SREJ_SENT, &chan->conn_state);
3968
				l2cap_send_ack(chan);
3969
				BT_DBG("chan %p, Exit SREJ_SENT", chan);
3970 3971 3972
			}
		} else {
			struct srej_list *l;
3973 3974

			/* duplicated tx_seq */
3975
			if (l2cap_add_to_srej_queue(chan, skb, tx_seq, sar) < 0)
3976
				goto drop;
3977

3978
			list_for_each_entry(l, &chan->srej_l, list) {
3979
				if (l->tx_seq == tx_seq) {
3980
					l2cap_resend_srejframe(chan, tx_seq);
3981 3982 3983
					return 0;
				}
			}
3984 3985 3986 3987 3988 3989

			err = l2cap_send_srejframe(chan, tx_seq);
			if (err < 0) {
				l2cap_send_disconn_req(chan->conn, chan, -err);
				return err;
			}
3990 3991
		}
	} else {
3992 3993
		expected_tx_seq_offset = __seq_offset(chan,
				chan->expected_tx_seq, chan->buffer_seq);
3994 3995 3996 3997 3998

		/* duplicated tx_seq */
		if (tx_seq_offset < expected_tx_seq_offset)
			goto drop;

3999
		set_bit(CONN_SREJ_SENT, &chan->conn_state);
4000

4001
		BT_DBG("chan %p, Enter SREJ", chan);
4002

4003
		INIT_LIST_HEAD(&chan->srej_l);
4004
		chan->buffer_seq_srej = chan->buffer_seq;
4005

4006
		__skb_queue_head_init(&chan->srej_q);
4007
		l2cap_add_to_srej_queue(chan, skb, tx_seq, sar);
4008

4009 4010 4011
		/* Set P-bit only if there are some I-frames to ack. */
		if (__clear_ack_timer(chan))
			set_bit(CONN_SEND_PBIT, &chan->conn_state);
4012

4013 4014 4015 4016 4017
		err = l2cap_send_srejframe(chan, tx_seq);
		if (err < 0) {
			l2cap_send_disconn_req(chan->conn, chan, -err);
			return err;
		}
4018
	}
4019 4020
	return 0;

4021
expected:
4022
	chan->expected_tx_seq = __next_seq(chan, chan->expected_tx_seq);
4023

4024
	if (test_bit(CONN_SREJ_SENT, &chan->conn_state)) {
4025 4026
		bt_cb(skb)->tx_seq = tx_seq;
		bt_cb(skb)->sar = sar;
4027
		__skb_queue_tail(&chan->srej_q, skb);
4028 4029 4030
		return 0;
	}

4031
	err = l2cap_reassemble_sdu(chan, skb, rx_control);
4032 4033
	chan->buffer_seq = __next_seq(chan, chan->buffer_seq);

4034 4035 4036 4037
	if (err < 0) {
		l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
		return err;
	}
4038

4039
	if (__is_ctrl_final(chan, rx_control)) {
4040
		if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
4041
			l2cap_retransmit_frames(chan);
4042 4043
	}

4044

4045 4046
	chan->num_acked = (chan->num_acked + 1) % num_to_ack;
	if (chan->num_acked == num_to_ack - 1)
4047
		l2cap_send_ack(chan);
4048 4049
	else
		__set_ack_timer(chan);
4050

4051
	return 0;
4052 4053 4054 4055

drop:
	kfree_skb(skb);
	return 0;
4056 4057
}

4058
static inline void l2cap_data_channel_rrframe(struct l2cap_chan *chan, u32 rx_control)
4059
{
4060
	BT_DBG("chan %p, req_seq %d ctrl 0x%8.8x", chan,
4061
				__get_reqseq(chan, rx_control), rx_control);
4062

4063
	chan->expected_ack_seq = __get_reqseq(chan, rx_control);
4064
	l2cap_drop_acked_frames(chan);
4065

4066
	if (__is_ctrl_poll(chan, rx_control)) {
4067 4068 4069
		set_bit(CONN_SEND_FBIT, &chan->conn_state);
		if (test_bit(CONN_SREJ_SENT, &chan->conn_state)) {
			if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
4070
					(chan->unacked_frames > 0))
4071
				__set_retrans_timer(chan);
4072

4073
			clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
4074
			l2cap_send_srejtail(chan);
4075
		} else {
4076
			l2cap_send_i_or_rr_or_rnr(chan);
4077
		}
4078

4079
	} else if (__is_ctrl_final(chan, rx_control)) {
4080
		clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
4081

4082
		if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
4083
			l2cap_retransmit_frames(chan);
4084

4085
	} else {
4086
		if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
4087
				(chan->unacked_frames > 0))
4088
			__set_retrans_timer(chan);
4089

4090 4091
		clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
		if (test_bit(CONN_SREJ_SENT, &chan->conn_state))
4092
			l2cap_send_ack(chan);
4093
		else
4094
			l2cap_ertm_send(chan);
4095 4096
	}
}
4097

4098
static inline void l2cap_data_channel_rejframe(struct l2cap_chan *chan, u32 rx_control)
4099
{
4100
	u16 tx_seq = __get_reqseq(chan, rx_control);
4101

4102
	BT_DBG("chan %p, req_seq %d ctrl 0x%8.8x", chan, tx_seq, rx_control);
4103

4104
	clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
4105

4106 4107
	chan->expected_ack_seq = tx_seq;
	l2cap_drop_acked_frames(chan);
4108

4109
	if (__is_ctrl_final(chan, rx_control)) {
4110
		if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
4111
			l2cap_retransmit_frames(chan);
4112
	} else {
4113
		l2cap_retransmit_frames(chan);
4114

4115 4116
		if (test_bit(CONN_WAIT_F, &chan->conn_state))
			set_bit(CONN_REJ_ACT, &chan->conn_state);
4117 4118
	}
}
4119
static inline void l2cap_data_channel_srejframe(struct l2cap_chan *chan, u32 rx_control)
4120
{
4121
	u16 tx_seq = __get_reqseq(chan, rx_control);
4122

4123
	BT_DBG("chan %p, req_seq %d ctrl 0x%8.8x", chan, tx_seq, rx_control);
4124

4125
	clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
4126

4127
	if (__is_ctrl_poll(chan, rx_control)) {
4128 4129
		chan->expected_ack_seq = tx_seq;
		l2cap_drop_acked_frames(chan);
4130

4131
		set_bit(CONN_SEND_FBIT, &chan->conn_state);
4132
		l2cap_retransmit_one_frame(chan, tx_seq);
4133

4134
		l2cap_ertm_send(chan);
4135

4136
		if (test_bit(CONN_WAIT_F, &chan->conn_state)) {
4137
			chan->srej_save_reqseq = tx_seq;
4138
			set_bit(CONN_SREJ_ACT, &chan->conn_state);
4139
		}
4140
	} else if (__is_ctrl_final(chan, rx_control)) {
4141
		if (test_bit(CONN_SREJ_ACT, &chan->conn_state) &&
4142
				chan->srej_save_reqseq == tx_seq)
4143
			clear_bit(CONN_SREJ_ACT, &chan->conn_state);
4144
		else
4145
			l2cap_retransmit_one_frame(chan, tx_seq);
4146
	} else {
4147
		l2cap_retransmit_one_frame(chan, tx_seq);
4148
		if (test_bit(CONN_WAIT_F, &chan->conn_state)) {
4149
			chan->srej_save_reqseq = tx_seq;
4150
			set_bit(CONN_SREJ_ACT, &chan->conn_state);
4151
		}
4152 4153 4154
	}
}

4155
static inline void l2cap_data_channel_rnrframe(struct l2cap_chan *chan, u32 rx_control)
4156
{
4157
	u16 tx_seq = __get_reqseq(chan, rx_control);
4158

4159
	BT_DBG("chan %p, req_seq %d ctrl 0x%8.8x", chan, tx_seq, rx_control);
4160

4161
	set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
4162 4163
	chan->expected_ack_seq = tx_seq;
	l2cap_drop_acked_frames(chan);
4164

4165
	if (__is_ctrl_poll(chan, rx_control))
4166
		set_bit(CONN_SEND_FBIT, &chan->conn_state);
4167

4168
	if (!test_bit(CONN_SREJ_SENT, &chan->conn_state)) {
4169
		__clear_retrans_timer(chan);
4170
		if (__is_ctrl_poll(chan, rx_control))
4171
			l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_FINAL);
4172
		return;
4173
	}
4174

4175
	if (__is_ctrl_poll(chan, rx_control)) {
4176
		l2cap_send_srejtail(chan);
4177 4178 4179 4180
	} else {
		rx_control = __set_ctrl_super(chan, L2CAP_SUPER_RR);
		l2cap_send_sframe(chan, rx_control);
	}
4181 4182
}

4183
static inline int l2cap_data_channel_sframe(struct l2cap_chan *chan, u32 rx_control, struct sk_buff *skb)
4184
{
4185
	BT_DBG("chan %p rx_control 0x%8.8x len %d", chan, rx_control, skb->len);
4186

4187
	if (__is_ctrl_final(chan, rx_control) &&
4188
			test_bit(CONN_WAIT_F, &chan->conn_state)) {
4189
		__clear_monitor_timer(chan);
4190
		if (chan->unacked_frames > 0)
4191
			__set_retrans_timer(chan);
4192
		clear_bit(CONN_WAIT_F, &chan->conn_state);
4193 4194
	}

4195 4196
	switch (__get_ctrl_super(chan, rx_control)) {
	case L2CAP_SUPER_RR:
4197
		l2cap_data_channel_rrframe(chan, rx_control);
4198 4199
		break;

4200
	case L2CAP_SUPER_REJ:
4201
		l2cap_data_channel_rejframe(chan, rx_control);
4202
		break;
4203

4204
	case L2CAP_SUPER_SREJ:
4205
		l2cap_data_channel_srejframe(chan, rx_control);
4206 4207
		break;

4208
	case L2CAP_SUPER_RNR:
4209
		l2cap_data_channel_rnrframe(chan, rx_control);
4210 4211 4212
		break;
	}

4213
	kfree_skb(skb);
4214 4215 4216
	return 0;
}

4217
static int l2cap_ertm_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
4218
{
4219
	u32 control;
4220
	u16 req_seq;
4221 4222
	int len, next_tx_seq_offset, req_seq_offset;

4223 4224
	control = __get_control(chan, skb->data);
	skb_pull(skb, __ctrl_size(chan));
4225 4226 4227 4228 4229 4230 4231
	len = skb->len;

	/*
	 * We can just drop the corrupted I-frame here.
	 * Receiver will miss it and start proper recovery
	 * procedures and ask retransmission.
	 */
4232
	if (l2cap_check_fcs(chan, skb))
4233 4234
		goto drop;

4235
	if (__is_sar_start(chan, control) && !__is_sframe(chan, control))
4236
		len -= L2CAP_SDULEN_SIZE;
4237

4238
	if (chan->fcs == L2CAP_FCS_CRC16)
4239
		len -= L2CAP_FCS_SIZE;
4240

4241
	if (len > chan->mps) {
4242
		l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
4243 4244 4245
		goto drop;
	}

4246
	req_seq = __get_reqseq(chan, control);
4247

4248 4249 4250 4251
	req_seq_offset = __seq_offset(chan, req_seq, chan->expected_ack_seq);

	next_tx_seq_offset = __seq_offset(chan, chan->next_tx_seq,
						chan->expected_ack_seq);
4252 4253 4254

	/* check for invalid req-seq */
	if (req_seq_offset > next_tx_seq_offset) {
4255
		l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
4256 4257 4258
		goto drop;
	}

4259
	if (!__is_sframe(chan, control)) {
4260
		if (len < 0) {
4261
			l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
4262 4263 4264
			goto drop;
		}

4265
		l2cap_data_channel_iframe(chan, control, skb);
4266 4267 4268
	} else {
		if (len != 0) {
			BT_ERR("%d", len);
4269
			l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
4270 4271 4272
			goto drop;
		}

4273
		l2cap_data_channel_sframe(chan, control, skb);
4274 4275 4276 4277 4278 4279 4280 4281 4282
	}

	return 0;

drop:
	kfree_skb(skb);
	return 0;
}

L
Linus Torvalds 已提交
4283 4284
static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk_buff *skb)
{
4285
	struct l2cap_chan *chan;
4286
	u32 control;
4287
	u16 tx_seq;
4288
	int len;
L
Linus Torvalds 已提交
4289

4290
	chan = l2cap_get_chan_by_scid(conn, cid);
4291
	if (!chan) {
L
Linus Torvalds 已提交
4292
		BT_DBG("unknown cid 0x%4.4x", cid);
4293
		/* Drop packet and return */
4294
		kfree_skb(skb);
4295
		return 0;
L
Linus Torvalds 已提交
4296 4297
	}

4298
	l2cap_chan_lock(chan);
4299

4300
	BT_DBG("chan %p, len %d", chan, skb->len);
L
Linus Torvalds 已提交
4301

4302
	if (chan->state != BT_CONNECTED)
L
Linus Torvalds 已提交
4303 4304
		goto drop;

4305
	switch (chan->mode) {
4306 4307 4308 4309 4310
	case L2CAP_MODE_BASIC:
		/* If socket recv buffers overflows we drop data here
		 * which is *bad* because L2CAP has to be reliable.
		 * But we don't have any other choice. L2CAP doesn't
		 * provide flow control mechanism. */
L
Linus Torvalds 已提交
4311

4312
		if (chan->imtu < skb->len)
4313
			goto drop;
L
Linus Torvalds 已提交
4314

4315
		if (!chan->ops->recv(chan->data, skb))
4316 4317 4318 4319
			goto done;
		break;

	case L2CAP_MODE_ERTM:
4320
		l2cap_ertm_data_rcv(chan, skb);
4321

4322
		goto done;
4323

4324
	case L2CAP_MODE_STREAMING:
4325 4326
		control = __get_control(chan, skb->data);
		skb_pull(skb, __ctrl_size(chan));
4327 4328
		len = skb->len;

4329
		if (l2cap_check_fcs(chan, skb))
4330 4331
			goto drop;

4332
		if (__is_sar_start(chan, control))
4333
			len -= L2CAP_SDULEN_SIZE;
4334

4335
		if (chan->fcs == L2CAP_FCS_CRC16)
4336
			len -= L2CAP_FCS_SIZE;
4337

4338
		if (len > chan->mps || len < 0 || __is_sframe(chan, control))
4339 4340
			goto drop;

4341
		tx_seq = __get_txseq(chan, control);
4342

4343 4344 4345 4346 4347 4348
		if (chan->expected_tx_seq != tx_seq) {
			/* Frame(s) missing - must discard partial SDU */
			kfree_skb(chan->sdu);
			chan->sdu = NULL;
			chan->sdu_last_frag = NULL;
			chan->sdu_len = 0;
4349

4350 4351 4352
			/* TODO: Notify userland of missing data */
		}

4353
		chan->expected_tx_seq = __next_seq(chan, tx_seq);
4354 4355 4356

		if (l2cap_reassemble_sdu(chan, skb, control) == -EMSGSIZE)
			l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
4357 4358 4359

		goto done;

4360
	default:
4361
		BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
4362 4363
		break;
	}
L
Linus Torvalds 已提交
4364 4365 4366 4367 4368

drop:
	kfree_skb(skb);

done:
4369
	l2cap_chan_unlock(chan);
4370

L
Linus Torvalds 已提交
4371 4372 4373
	return 0;
}

4374
static inline int l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, struct sk_buff *skb)
L
Linus Torvalds 已提交
4375
{
4376
	struct l2cap_chan *chan;
L
Linus Torvalds 已提交
4377

4378 4379
	chan = l2cap_global_chan_by_psm(0, psm, conn->src);
	if (!chan)
L
Linus Torvalds 已提交
4380 4381
		goto drop;

4382
	BT_DBG("chan %p, len %d", chan, skb->len);
L
Linus Torvalds 已提交
4383

4384
	if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
L
Linus Torvalds 已提交
4385 4386
		goto drop;

4387
	if (chan->imtu < skb->len)
L
Linus Torvalds 已提交
4388 4389
		goto drop;

4390
	if (!chan->ops->recv(chan->data, skb))
4391
		return 0;
L
Linus Torvalds 已提交
4392 4393 4394 4395 4396 4397 4398

drop:
	kfree_skb(skb);

	return 0;
}

4399 4400
static inline int l2cap_att_channel(struct l2cap_conn *conn, u16 cid,
				    struct sk_buff *skb)
4401
{
4402
	struct l2cap_chan *chan;
4403

4404 4405
	chan = l2cap_global_chan_by_scid(0, cid, conn->src);
	if (!chan)
4406 4407
		goto drop;

4408
	BT_DBG("chan %p, len %d", chan, skb->len);
4409

4410
	if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
4411 4412
		goto drop;

4413
	if (chan->imtu < skb->len)
4414 4415
		goto drop;

4416
	if (!chan->ops->recv(chan->data, skb))
4417
		return 0;
4418 4419 4420 4421 4422 4423 4424

drop:
	kfree_skb(skb);

	return 0;
}

L
Linus Torvalds 已提交
4425 4426 4427
static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
{
	struct l2cap_hdr *lh = (void *) skb->data;
4428 4429
	u16 cid, len;
	__le16 psm;
L
Linus Torvalds 已提交
4430 4431 4432 4433 4434

	skb_pull(skb, L2CAP_HDR_SIZE);
	cid = __le16_to_cpu(lh->cid);
	len = __le16_to_cpu(lh->len);

4435 4436 4437 4438 4439
	if (len != skb->len) {
		kfree_skb(skb);
		return;
	}

L
Linus Torvalds 已提交
4440 4441 4442
	BT_DBG("len %d, cid 0x%4.4x", len, cid);

	switch (cid) {
4443
	case L2CAP_CID_LE_SIGNALING:
4444
	case L2CAP_CID_SIGNALING:
L
Linus Torvalds 已提交
4445 4446 4447
		l2cap_sig_channel(conn, skb);
		break;

4448
	case L2CAP_CID_CONN_LESS:
4449
		psm = get_unaligned((__le16 *) skb->data);
L
Linus Torvalds 已提交
4450 4451 4452 4453
		skb_pull(skb, 2);
		l2cap_conless_channel(conn, psm, skb);
		break;

4454 4455 4456 4457
	case L2CAP_CID_LE_DATA:
		l2cap_att_channel(conn, cid, skb);
		break;

4458 4459 4460 4461 4462
	case L2CAP_CID_SMP:
		if (smp_sig_channel(conn, skb))
			l2cap_conn_del(conn->hcon, EACCES);
		break;

L
Linus Torvalds 已提交
4463 4464 4465 4466 4467 4468 4469 4470
	default:
		l2cap_data_channel(conn, cid, skb);
		break;
	}
}

/* ---- L2CAP interface with lower layer (HCI) ---- */

4471
int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
L
Linus Torvalds 已提交
4472 4473
{
	int exact = 0, lm1 = 0, lm2 = 0;
4474
	struct l2cap_chan *c;
L
Linus Torvalds 已提交
4475 4476 4477 4478

	BT_DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr));

	/* Find listening sockets and check their link_mode */
4479 4480 4481
	read_lock(&chan_list_lock);
	list_for_each_entry(c, &chan_list, global_l) {
		struct sock *sk = c->sk;
4482

4483
		if (c->state != BT_LISTEN)
L
Linus Torvalds 已提交
4484 4485 4486
			continue;

		if (!bacmp(&bt_sk(sk)->src, &hdev->bdaddr)) {
4487
			lm1 |= HCI_LM_ACCEPT;
4488
			if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
4489
				lm1 |= HCI_LM_MASTER;
L
Linus Torvalds 已提交
4490
			exact++;
4491 4492
		} else if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) {
			lm2 |= HCI_LM_ACCEPT;
4493
			if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
4494 4495
				lm2 |= HCI_LM_MASTER;
		}
L
Linus Torvalds 已提交
4496
	}
4497
	read_unlock(&chan_list_lock);
L
Linus Torvalds 已提交
4498 4499 4500 4501

	return exact ? lm1 : lm2;
}

4502
int l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
L
Linus Torvalds 已提交
4503
{
4504 4505
	struct l2cap_conn *conn;

L
Linus Torvalds 已提交
4506 4507 4508 4509 4510 4511
	BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status);

	if (!status) {
		conn = l2cap_conn_add(hcon, status);
		if (conn)
			l2cap_conn_ready(conn);
4512
	} else
4513
		l2cap_conn_del(hcon, bt_to_errno(status));
L
Linus Torvalds 已提交
4514 4515 4516 4517

	return 0;
}

4518
int l2cap_disconn_ind(struct hci_conn *hcon)
4519 4520 4521 4522 4523
{
	struct l2cap_conn *conn = hcon->l2cap_data;

	BT_DBG("hcon %p", hcon);

4524
	if (!conn)
4525
		return HCI_ERROR_REMOTE_USER_TERM;
4526 4527 4528
	return conn->disc_reason;
}

4529
int l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
L
Linus Torvalds 已提交
4530 4531 4532
{
	BT_DBG("hcon %p reason %d", hcon, reason);

4533
	l2cap_conn_del(hcon, bt_to_errno(reason));
L
Linus Torvalds 已提交
4534 4535 4536
	return 0;
}

4537
static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
4538
{
4539
	if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
4540 4541
		return;

4542
	if (encrypt == 0x00) {
4543
		if (chan->sec_level == BT_SECURITY_MEDIUM) {
4544
			__set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
4545
		} else if (chan->sec_level == BT_SECURITY_HIGH)
4546
			l2cap_chan_close(chan, ECONNREFUSED);
4547
	} else {
4548
		if (chan->sec_level == BT_SECURITY_MEDIUM)
4549
			__clear_chan_timer(chan);
4550 4551 4552
	}
}

4553
int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
L
Linus Torvalds 已提交
4554
{
4555
	struct l2cap_conn *conn = hcon->l2cap_data;
4556
	struct l2cap_chan *chan;
L
Linus Torvalds 已提交
4557

4558
	if (!conn)
L
Linus Torvalds 已提交
4559
		return 0;
4560

L
Linus Torvalds 已提交
4561 4562
	BT_DBG("conn %p", conn);

4563 4564
	if (hcon->type == LE_LINK) {
		smp_distribute_keys(conn, 0);
4565
		cancel_delayed_work(&conn->security_timer);
4566 4567
	}

4568
	mutex_lock(&conn->chan_lock);
L
Linus Torvalds 已提交
4569

4570
	list_for_each_entry(chan, &conn->chan_l, list) {
4571
		l2cap_chan_lock(chan);
L
Linus Torvalds 已提交
4572

4573 4574 4575 4576 4577
		BT_DBG("chan->scid %d", chan->scid);

		if (chan->scid == L2CAP_CID_LE_DATA) {
			if (!status && encrypt) {
				chan->sec_level = hcon->sec_level;
4578
				l2cap_chan_ready(chan);
4579 4580
			}

4581
			l2cap_chan_unlock(chan);
4582 4583 4584
			continue;
		}

4585
		if (test_bit(CONF_CONNECT_PEND, &chan->conf_state)) {
4586
			l2cap_chan_unlock(chan);
4587 4588 4589
			continue;
		}

4590 4591
		if (!status && (chan->state == BT_CONNECTED ||
						chan->state == BT_CONFIG)) {
4592
			l2cap_check_encryption(chan, encrypt);
4593
			l2cap_chan_unlock(chan);
4594 4595 4596
			continue;
		}

4597
		if (chan->state == BT_CONNECT) {
4598
			if (!status) {
4599
				l2cap_send_conn_req(chan);
4600
			} else {
4601
				__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
4602
			}
4603
		} else if (chan->state == BT_CONNECT2) {
4604
			struct sock *sk = chan->sk;
4605
			struct l2cap_conn_rsp rsp;
4606
			__u16 res, stat;
L
Linus Torvalds 已提交
4607

4608 4609
			lock_sock(sk);

4610
			if (!status) {
4611 4612 4613 4614
				if (bt_sk(sk)->defer_setup) {
					struct sock *parent = bt_sk(sk)->parent;
					res = L2CAP_CR_PEND;
					stat = L2CAP_CS_AUTHOR_PEND;
4615 4616
					if (parent)
						parent->sk_data_ready(parent, 0);
4617
				} else {
4618
					__l2cap_state_change(chan, BT_CONFIG);
4619 4620 4621
					res = L2CAP_CR_SUCCESS;
					stat = L2CAP_CS_NO_INFO;
				}
4622
			} else {
4623
				__l2cap_state_change(chan, BT_DISCONN);
4624
				__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
4625 4626
				res = L2CAP_CR_SEC_BLOCK;
				stat = L2CAP_CS_NO_INFO;
4627 4628
			}

4629 4630
			release_sock(sk);

4631 4632
			rsp.scid   = cpu_to_le16(chan->dcid);
			rsp.dcid   = cpu_to_le16(chan->scid);
4633 4634
			rsp.result = cpu_to_le16(res);
			rsp.status = cpu_to_le16(stat);
4635 4636
			l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
							sizeof(rsp), &rsp);
4637
		}
L
Linus Torvalds 已提交
4638

4639
		l2cap_chan_unlock(chan);
L
Linus Torvalds 已提交
4640 4641
	}

4642
	mutex_unlock(&conn->chan_lock);
4643

L
Linus Torvalds 已提交
4644 4645 4646
	return 0;
}

4647
int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
L
Linus Torvalds 已提交
4648 4649 4650
{
	struct l2cap_conn *conn = hcon->l2cap_data;

4651 4652 4653 4654
	if (!conn)
		conn = l2cap_conn_add(hcon, 0);

	if (!conn)
L
Linus Torvalds 已提交
4655 4656 4657 4658
		goto drop;

	BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);

4659
	if (!(flags & ACL_CONT)) {
L
Linus Torvalds 已提交
4660
		struct l2cap_hdr *hdr;
4661
		struct l2cap_chan *chan;
4662
		u16 cid;
L
Linus Torvalds 已提交
4663 4664 4665 4666 4667 4668 4669 4670 4671 4672
		int len;

		if (conn->rx_len) {
			BT_ERR("Unexpected start frame (len %d)", skb->len);
			kfree_skb(conn->rx_skb);
			conn->rx_skb = NULL;
			conn->rx_len = 0;
			l2cap_conn_unreliable(conn, ECOMM);
		}

4673 4674
		/* Start fragment always begin with Basic L2CAP header */
		if (skb->len < L2CAP_HDR_SIZE) {
L
Linus Torvalds 已提交
4675 4676 4677 4678 4679 4680 4681
			BT_ERR("Frame is too short (len %d)", skb->len);
			l2cap_conn_unreliable(conn, ECOMM);
			goto drop;
		}

		hdr = (struct l2cap_hdr *) skb->data;
		len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
4682
		cid = __le16_to_cpu(hdr->cid);
L
Linus Torvalds 已提交
4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698

		if (len == skb->len) {
			/* Complete frame received */
			l2cap_recv_frame(conn, skb);
			return 0;
		}

		BT_DBG("Start: total len %d, frag len %d", len, skb->len);

		if (skb->len > len) {
			BT_ERR("Frame is too long (len %d, expected len %d)",
				skb->len, len);
			l2cap_conn_unreliable(conn, ECOMM);
			goto drop;
		}

4699
		chan = l2cap_get_chan_by_scid(conn, cid);
4700

4701 4702
		if (chan && chan->sk) {
			struct sock *sk = chan->sk;
4703
			lock_sock(sk);
4704

4705
			if (chan->imtu < len - L2CAP_HDR_SIZE) {
4706 4707
				BT_ERR("Frame exceeding recv MTU (len %d, "
							"MTU %d)", len,
4708
							chan->imtu);
4709
				release_sock(sk);
4710 4711 4712
				l2cap_conn_unreliable(conn, ECOMM);
				goto drop;
			}
4713
			release_sock(sk);
4714
		}
4715

L
Linus Torvalds 已提交
4716
		/* Allocate skb for the complete frame (with header) */
4717 4718
		conn->rx_skb = bt_skb_alloc(len, GFP_ATOMIC);
		if (!conn->rx_skb)
L
Linus Torvalds 已提交
4719 4720
			goto drop;

4721
		skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
4722
								skb->len);
L
Linus Torvalds 已提交
4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742
		conn->rx_len = len - skb->len;
	} else {
		BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);

		if (!conn->rx_len) {
			BT_ERR("Unexpected continuation frame (len %d)", skb->len);
			l2cap_conn_unreliable(conn, ECOMM);
			goto drop;
		}

		if (skb->len > conn->rx_len) {
			BT_ERR("Fragment is too long (len %d, expected %d)",
					skb->len, conn->rx_len);
			kfree_skb(conn->rx_skb);
			conn->rx_skb = NULL;
			conn->rx_len = 0;
			l2cap_conn_unreliable(conn, ECOMM);
			goto drop;
		}

4743
		skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
4744
								skb->len);
L
Linus Torvalds 已提交
4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758
		conn->rx_len -= skb->len;

		if (!conn->rx_len) {
			/* Complete frame received */
			l2cap_recv_frame(conn, conn->rx_skb);
			conn->rx_skb = NULL;
		}
	}

drop:
	kfree_skb(skb);
	return 0;
}

4759
static int l2cap_debugfs_show(struct seq_file *f, void *p)
L
Linus Torvalds 已提交
4760
{
4761
	struct l2cap_chan *c;
L
Linus Torvalds 已提交
4762

4763
	read_lock(&chan_list_lock);
L
Linus Torvalds 已提交
4764

4765 4766
	list_for_each_entry(c, &chan_list, global_l) {
		struct sock *sk = c->sk;
4767

4768
		seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n",
4769 4770
					batostr(&bt_sk(sk)->src),
					batostr(&bt_sk(sk)->dst),
4771
					c->state, __le16_to_cpu(c->psm),
4772 4773
					c->scid, c->dcid, c->imtu, c->omtu,
					c->sec_level, c->mode);
4774
	}
L
Linus Torvalds 已提交
4775

4776
	read_unlock(&chan_list_lock);
L
Linus Torvalds 已提交
4777

4778
	return 0;
L
Linus Torvalds 已提交
4779 4780
}

4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793
static int l2cap_debugfs_open(struct inode *inode, struct file *file)
{
	return single_open(file, l2cap_debugfs_show, inode->i_private);
}

static const struct file_operations l2cap_debugfs_fops = {
	.open		= l2cap_debugfs_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
};

static struct dentry *l2cap_debugfs;
L
Linus Torvalds 已提交
4794

4795
int __init l2cap_init(void)
L
Linus Torvalds 已提交
4796 4797
{
	int err;
4798

4799
	err = l2cap_init_sockets();
L
Linus Torvalds 已提交
4800 4801 4802
	if (err < 0)
		return err;

4803 4804 4805 4806 4807 4808
	if (bt_debugfs) {
		l2cap_debugfs = debugfs_create_file("l2cap", 0444,
					bt_debugfs, NULL, &l2cap_debugfs_fops);
		if (!l2cap_debugfs)
			BT_ERR("Failed to create L2CAP debug file");
	}
L
Linus Torvalds 已提交
4809 4810 4811 4812

	return 0;
}

4813
void l2cap_exit(void)
L
Linus Torvalds 已提交
4814
{
4815
	debugfs_remove(l2cap_debugfs);
4816
	l2cap_cleanup_sockets();
L
Linus Torvalds 已提交
4817 4818
}

4819 4820
module_param(disable_ertm, bool, 0644);
MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");