xref: /openbmc/linux/net/bluetooth/l2cap_sock.c (revision 4eb706b1)
1bb58f747SGustavo F. Padovan /*
2bb58f747SGustavo F. Padovan    BlueZ - Bluetooth protocol stack for Linux
3bb58f747SGustavo F. Padovan    Copyright (C) 2000-2001 Qualcomm Incorporated
4bb58f747SGustavo F. Padovan    Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
5bb58f747SGustavo F. Padovan    Copyright (C) 2010 Google Inc.
6590051deSGustavo F. Padovan    Copyright (C) 2011 ProFUSION Embedded Systems
7bb58f747SGustavo F. Padovan 
8bb58f747SGustavo F. Padovan    Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
9bb58f747SGustavo F. Padovan 
10bb58f747SGustavo F. Padovan    This program is free software; you can redistribute it and/or modify
11bb58f747SGustavo F. Padovan    it under the terms of the GNU General Public License version 2 as
12bb58f747SGustavo F. Padovan    published by the Free Software Foundation;
13bb58f747SGustavo F. Padovan 
14bb58f747SGustavo F. Padovan    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15bb58f747SGustavo F. Padovan    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16bb58f747SGustavo F. Padovan    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
17bb58f747SGustavo F. Padovan    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
18bb58f747SGustavo F. Padovan    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
19bb58f747SGustavo F. Padovan    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20bb58f747SGustavo F. Padovan    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
21bb58f747SGustavo F. Padovan    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22bb58f747SGustavo F. Padovan 
23bb58f747SGustavo F. Padovan    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
24bb58f747SGustavo F. Padovan    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
25bb58f747SGustavo F. Padovan    SOFTWARE IS DISCLAIMED.
26bb58f747SGustavo F. Padovan */
27bb58f747SGustavo F. Padovan 
28bb58f747SGustavo F. Padovan /* Bluetooth L2CAP sockets. */
29bb58f747SGustavo F. Padovan 
309149761aSJohan Hedberg #include <linux/module.h>
31bc3b2d7fSPaul Gortmaker #include <linux/export.h>
32b6459415SJakub Kicinski #include <linux/filter.h>
33174cd4b1SIngo Molnar #include <linux/sched/signal.h>
346230c9b4SPaul Moore 
35bb58f747SGustavo F. Padovan #include <net/bluetooth/bluetooth.h>
3633575df7SGustavo F. Padovan #include <net/bluetooth/hci_core.h>
37bb58f747SGustavo F. Padovan #include <net/bluetooth/l2cap.h>
38ac4b7236SMarcel Holtmann 
39ac4b7236SMarcel Holtmann #include "smp.h"
40bb58f747SGustavo F. Padovan 
415b28d95cSMasatake YAMATO static struct bt_sock_list l2cap_sk_list = {
425b28d95cSMasatake YAMATO 	.lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
435b28d95cSMasatake YAMATO };
445b28d95cSMasatake YAMATO 
45cf2f90f5SGustavo F. Padovan static const struct proto_ops l2cap_sock_ops;
4680808e43SGustavo F. Padovan static void l2cap_sock_init(struct sock *sk, struct sock *parent);
472d792818SGustavo Padovan static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
4811aa9c28SEric W. Biederman 				     int proto, gfp_t prio, int kern);
491728137bSSungwoo Kim static void l2cap_sock_cleanup_listen(struct sock *parent);
50cf2f90f5SGustavo F. Padovan 
l2cap_is_socket(struct socket * sock)51b3916db3SDavid Herrmann bool l2cap_is_socket(struct socket *sock)
52b3916db3SDavid Herrmann {
53b3916db3SDavid Herrmann 	return sock && sock->ops == &l2cap_sock_ops;
54b3916db3SDavid Herrmann }
55b3916db3SDavid Herrmann EXPORT_SYMBOL(l2cap_is_socket);
56b3916db3SDavid Herrmann 
l2cap_validate_bredr_psm(u16 psm)574946096dSJohan Hedberg static int l2cap_validate_bredr_psm(u16 psm)
584946096dSJohan Hedberg {
594946096dSJohan Hedberg 	/* PSM must be odd and lsb of upper byte must be 0 */
604946096dSJohan Hedberg 	if ((psm & 0x0101) != 0x0001)
614946096dSJohan Hedberg 		return -EINVAL;
624946096dSJohan Hedberg 
634946096dSJohan Hedberg 	/* Restrict usage of well-known PSMs */
64114f9f1eSJohan Hedberg 	if (psm < L2CAP_PSM_DYN_START && !capable(CAP_NET_BIND_SERVICE))
654946096dSJohan Hedberg 		return -EACCES;
664946096dSJohan Hedberg 
674946096dSJohan Hedberg 	return 0;
684946096dSJohan Hedberg }
694946096dSJohan Hedberg 
l2cap_validate_le_psm(u16 psm)704946096dSJohan Hedberg static int l2cap_validate_le_psm(u16 psm)
714946096dSJohan Hedberg {
724946096dSJohan Hedberg 	/* Valid LE_PSM ranges are defined only until 0x00ff */
73114f9f1eSJohan Hedberg 	if (psm > L2CAP_PSM_LE_DYN_END)
744946096dSJohan Hedberg 		return -EINVAL;
754946096dSJohan Hedberg 
764946096dSJohan Hedberg 	/* Restrict fixed, SIG assigned PSM values to CAP_NET_BIND_SERVICE */
77114f9f1eSJohan Hedberg 	if (psm < L2CAP_PSM_LE_DYN_START && !capable(CAP_NET_BIND_SERVICE))
784946096dSJohan Hedberg 		return -EACCES;
794946096dSJohan Hedberg 
804946096dSJohan Hedberg 	return 0;
814946096dSJohan Hedberg }
824946096dSJohan Hedberg 
l2cap_sock_bind(struct socket * sock,struct sockaddr * addr,int alen)83af6bcd82SGustavo F. Padovan static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
84af6bcd82SGustavo F. Padovan {
85af6bcd82SGustavo F. Padovan 	struct sock *sk = sock->sk;
864343478fSGustavo F. Padovan 	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
87af6bcd82SGustavo F. Padovan 	struct sockaddr_l2 la;
88af6bcd82SGustavo F. Padovan 	int len, err = 0;
89af6bcd82SGustavo F. Padovan 
90af6bcd82SGustavo F. Padovan 	BT_DBG("sk %p", sk);
91af6bcd82SGustavo F. Padovan 
92d2ecfa76SMateusz Jurczyk 	if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
93d2ecfa76SMateusz Jurczyk 	    addr->sa_family != AF_BLUETOOTH)
94af6bcd82SGustavo F. Padovan 		return -EINVAL;
95af6bcd82SGustavo F. Padovan 
96af6bcd82SGustavo F. Padovan 	memset(&la, 0, sizeof(la));
97af6bcd82SGustavo F. Padovan 	len = min_t(unsigned int, sizeof(la), alen);
98af6bcd82SGustavo F. Padovan 	memcpy(&la, addr, len);
99af6bcd82SGustavo F. Padovan 
100b62f328bSVille Tervo 	if (la.l2_cid && la.l2_psm)
101af6bcd82SGustavo F. Padovan 		return -EINVAL;
102af6bcd82SGustavo F. Padovan 
10380c1a2e7SJohan Hedberg 	if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
10480c1a2e7SJohan Hedberg 		return -EINVAL;
10580c1a2e7SJohan Hedberg 
106bfe4655fSJohan Hedberg 	if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
107bfe4655fSJohan Hedberg 		/* We only allow ATT user space socket */
1089149761aSJohan Hedberg 		if (la.l2_cid &&
109dcf4adbfSJoe Perches 		    la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
110bfe4655fSJohan Hedberg 			return -EINVAL;
111bfe4655fSJohan Hedberg 	}
112bfe4655fSJohan Hedberg 
113af6bcd82SGustavo F. Padovan 	lock_sock(sk);
114af6bcd82SGustavo F. Padovan 
115af6bcd82SGustavo F. Padovan 	if (sk->sk_state != BT_OPEN) {
116af6bcd82SGustavo F. Padovan 		err = -EBADFD;
117af6bcd82SGustavo F. Padovan 		goto done;
118af6bcd82SGustavo F. Padovan 	}
119af6bcd82SGustavo F. Padovan 
120af6bcd82SGustavo F. Padovan 	if (la.l2_psm) {
121af6bcd82SGustavo F. Padovan 		__u16 psm = __le16_to_cpu(la.l2_psm);
122af6bcd82SGustavo F. Padovan 
1234946096dSJohan Hedberg 		if (la.l2_bdaddr_type == BDADDR_BREDR)
1244946096dSJohan Hedberg 			err = l2cap_validate_bredr_psm(psm);
1254946096dSJohan Hedberg 		else
1264946096dSJohan Hedberg 			err = l2cap_validate_le_psm(psm);
127af6bcd82SGustavo F. Padovan 
1284946096dSJohan Hedberg 		if (err)
129af6bcd82SGustavo F. Padovan 			goto done;
130af6bcd82SGustavo F. Padovan 	}
131af6bcd82SGustavo F. Padovan 
132a2342c5fSJohan Hedberg 	bacpy(&chan->src, &la.l2_bdaddr);
133a2342c5fSJohan Hedberg 	chan->src_type = la.l2_bdaddr_type;
134a2342c5fSJohan Hedberg 
1359e4425ffSGustavo F. Padovan 	if (la.l2_cid)
1366e4aff10SSantosh Nayak 		err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
1379e4425ffSGustavo F. Padovan 	else
1389e4425ffSGustavo F. Padovan 		err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
139af6bcd82SGustavo F. Padovan 
1409e4425ffSGustavo F. Padovan 	if (err < 0)
1419e4425ffSGustavo F. Padovan 		goto done;
142af6bcd82SGustavo F. Padovan 
1436a974b50SMarcel Holtmann 	switch (chan->chan_type) {
1443124b843SMarcel Holtmann 	case L2CAP_CHAN_CONN_LESS:
1453124b843SMarcel Holtmann 		if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_3DSP)
1463124b843SMarcel Holtmann 			chan->sec_level = BT_SECURITY_SDP;
1473124b843SMarcel Holtmann 		break;
1486a974b50SMarcel Holtmann 	case L2CAP_CHAN_CONN_ORIENTED:
1492983fd68SAndrei Emeltchenko 		if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
1502983fd68SAndrei Emeltchenko 		    __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
1514343478fSGustavo F. Padovan 			chan->sec_level = BT_SECURITY_SDP;
1526a974b50SMarcel Holtmann 		break;
153cb6ca8e1SJohan Hedberg 	case L2CAP_CHAN_RAW:
154cb6ca8e1SJohan Hedberg 		chan->sec_level = BT_SECURITY_SDP;
155cb6ca8e1SJohan Hedberg 		break;
156c16900cfSJohan Hedberg 	case L2CAP_CHAN_FIXED:
157c16900cfSJohan Hedberg 		/* Fixed channels default to the L2CAP core not holding a
158c16900cfSJohan Hedberg 		 * hci_conn reference for them. For fixed channels mapping to
159c16900cfSJohan Hedberg 		 * L2CAP sockets we do want to hold a reference so set the
160c16900cfSJohan Hedberg 		 * appropriate flag to request it.
161c16900cfSJohan Hedberg 		 */
162c16900cfSJohan Hedberg 		set_bit(FLAG_HOLD_HCI_CONN, &chan->flags);
163c16900cfSJohan Hedberg 		break;
1646a974b50SMarcel Holtmann 	}
165af6bcd82SGustavo F. Padovan 
16630d57722SLuiz Augusto von Dentz 	/* Use L2CAP_MODE_LE_FLOWCTL (CoC) in case of LE address and
16730d57722SLuiz Augusto von Dentz 	 * L2CAP_MODE_EXT_FLOWCTL (ECRED) has not been set.
16830d57722SLuiz Augusto von Dentz 	 */
16930d57722SLuiz Augusto von Dentz 	if (chan->psm && bdaddr_type_is_le(chan->src_type) &&
17030d57722SLuiz Augusto von Dentz 	    chan->mode != L2CAP_MODE_EXT_FLOWCTL)
1710ce43ce6SJohan Hedberg 		chan->mode = L2CAP_MODE_LE_FLOWCTL;
17238319713SJohan Hedberg 
17389bc500eSGustavo F. Padovan 	chan->state = BT_BOUND;
1749e4425ffSGustavo F. Padovan 	sk->sk_state = BT_BOUND;
175af6bcd82SGustavo F. Padovan 
176af6bcd82SGustavo F. Padovan done:
177af6bcd82SGustavo F. Padovan 	release_sock(sk);
178af6bcd82SGustavo F. Padovan 	return err;
179af6bcd82SGustavo F. Padovan }
180af6bcd82SGustavo F. Padovan 
l2cap_sock_connect(struct socket * sock,struct sockaddr * addr,int alen,int flags)1812d792818SGustavo Padovan static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
1822d792818SGustavo Padovan 			      int alen, int flags)
1834e34c50bSGustavo F. Padovan {
1844e34c50bSGustavo F. Padovan 	struct sock *sk = sock->sk;
1850c1bc5c6SGustavo F. Padovan 	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1864e34c50bSGustavo F. Padovan 	struct sockaddr_l2 la;
1874e34c50bSGustavo F. Padovan 	int len, err = 0;
1883af70b39SArchie Pusaka 	bool zapped;
1894e34c50bSGustavo F. Padovan 
1904e34c50bSGustavo F. Padovan 	BT_DBG("sk %p", sk);
1914e34c50bSGustavo F. Padovan 
1923af70b39SArchie Pusaka 	lock_sock(sk);
1933af70b39SArchie Pusaka 	zapped = sock_flag(sk, SOCK_ZAPPED);
1943af70b39SArchie Pusaka 	release_sock(sk);
1953af70b39SArchie Pusaka 
1963af70b39SArchie Pusaka 	if (zapped)
1973af70b39SArchie Pusaka 		return -EINVAL;
1983af70b39SArchie Pusaka 
199d2ecfa76SMateusz Jurczyk 	if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
2004e34c50bSGustavo F. Padovan 	    addr->sa_family != AF_BLUETOOTH)
2014e34c50bSGustavo F. Padovan 		return -EINVAL;
2024e34c50bSGustavo F. Padovan 
2034e34c50bSGustavo F. Padovan 	memset(&la, 0, sizeof(la));
2044e34c50bSGustavo F. Padovan 	len = min_t(unsigned int, sizeof(la), alen);
2054e34c50bSGustavo F. Padovan 	memcpy(&la, addr, len);
2064e34c50bSGustavo F. Padovan 
207acd7d370SVille Tervo 	if (la.l2_cid && la.l2_psm)
2084e34c50bSGustavo F. Padovan 		return -EINVAL;
2094e34c50bSGustavo F. Padovan 
21080c1a2e7SJohan Hedberg 	if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
21180c1a2e7SJohan Hedberg 		return -EINVAL;
21280c1a2e7SJohan Hedberg 
213eb622495SJohan Hedberg 	/* Check that the socket wasn't bound to something that
214eb622495SJohan Hedberg 	 * conflicts with the address given to connect(). If chan->src
215eb622495SJohan Hedberg 	 * is BDADDR_ANY it means bind() was never used, in which case
216eb622495SJohan Hedberg 	 * chan->src_type and la.l2_bdaddr_type do not need to match.
217eb622495SJohan Hedberg 	 */
218eb622495SJohan Hedberg 	if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
219eb622495SJohan Hedberg 	    bdaddr_type_is_le(la.l2_bdaddr_type)) {
220eb622495SJohan Hedberg 		/* Old user space versions will try to incorrectly bind
221eb622495SJohan Hedberg 		 * the ATT socket using BDADDR_BREDR. We need to accept
222eb622495SJohan Hedberg 		 * this and fix up the source address type only when
223eb622495SJohan Hedberg 		 * both the source CID and destination CID indicate
224eb622495SJohan Hedberg 		 * ATT. Anything else is an invalid combination.
225eb622495SJohan Hedberg 		 */
226eb622495SJohan Hedberg 		if (chan->scid != L2CAP_CID_ATT ||
227dcf4adbfSJoe Perches 		    la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
2281f209383SJohan Hedberg 			return -EINVAL;
2291f209383SJohan Hedberg 
230eb622495SJohan Hedberg 		/* We don't have the hdev available here to make a
231eb622495SJohan Hedberg 		 * better decision on random vs public, but since all
232eb622495SJohan Hedberg 		 * user space versions that exhibit this issue anyway do
233eb622495SJohan Hedberg 		 * not support random local addresses assuming public
234eb622495SJohan Hedberg 		 * here is good enough.
235eb622495SJohan Hedberg 		 */
236eb622495SJohan Hedberg 		chan->src_type = BDADDR_LE_PUBLIC;
237eb622495SJohan Hedberg 	}
238eb622495SJohan Hedberg 
2391f209383SJohan Hedberg 	if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
2401f209383SJohan Hedberg 		return -EINVAL;
2411f209383SJohan Hedberg 
242bfe4655fSJohan Hedberg 	if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
243bfe4655fSJohan Hedberg 		/* We only allow ATT user space socket */
2449149761aSJohan Hedberg 		if (la.l2_cid &&
245dcf4adbfSJoe Perches 		    la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
246bfe4655fSJohan Hedberg 			return -EINVAL;
247bfe4655fSJohan Hedberg 	}
248bfe4655fSJohan Hedberg 
24930d57722SLuiz Augusto von Dentz 	/* Use L2CAP_MODE_LE_FLOWCTL (CoC) in case of LE address and
25030d57722SLuiz Augusto von Dentz 	 * L2CAP_MODE_EXT_FLOWCTL (ECRED) has not been set.
25130d57722SLuiz Augusto von Dentz 	 */
25230d57722SLuiz Augusto von Dentz 	if (chan->psm && bdaddr_type_is_le(chan->src_type) &&
25330d57722SLuiz Augusto von Dentz 	    chan->mode != L2CAP_MODE_EXT_FLOWCTL)
2540ce43ce6SJohan Hedberg 		chan->mode = L2CAP_MODE_LE_FLOWCTL;
25538319713SJohan Hedberg 
2566e4aff10SSantosh Nayak 	err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
2578e9f9892SAndre Guedes 				 &la.l2_bdaddr, la.l2_bdaddr_type);
2584e34c50bSGustavo F. Padovan 	if (err)
259b3fb611eSAndrei Emeltchenko 		return err;
2604e34c50bSGustavo F. Padovan 
2616be36555SAndrei Emeltchenko 	lock_sock(sk);
2626be36555SAndrei Emeltchenko 
2634e34c50bSGustavo F. Padovan 	err = bt_sock_wait_state(sk, BT_CONNECTED,
2644e34c50bSGustavo F. Padovan 				 sock_sndtimeo(sk, flags & O_NONBLOCK));
265b3fb611eSAndrei Emeltchenko 
2664e34c50bSGustavo F. Padovan 	release_sock(sk);
267b3fb611eSAndrei Emeltchenko 
2684e34c50bSGustavo F. Padovan 	return err;
2694e34c50bSGustavo F. Padovan }
2704e34c50bSGustavo F. Padovan 
l2cap_sock_listen(struct socket * sock,int backlog)271af6bcd82SGustavo F. Padovan static int l2cap_sock_listen(struct socket *sock, int backlog)
272af6bcd82SGustavo F. Padovan {
273af6bcd82SGustavo F. Padovan 	struct sock *sk = sock->sk;
2740c1bc5c6SGustavo F. Padovan 	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
275af6bcd82SGustavo F. Padovan 	int err = 0;
276af6bcd82SGustavo F. Padovan 
277af6bcd82SGustavo F. Padovan 	BT_DBG("sk %p backlog %d", sk, backlog);
278af6bcd82SGustavo F. Padovan 
279af6bcd82SGustavo F. Padovan 	lock_sock(sk);
280af6bcd82SGustavo F. Padovan 
2816b3af733SMarcel Holtmann 	if (sk->sk_state != BT_BOUND) {
282af6bcd82SGustavo F. Padovan 		err = -EBADFD;
283af6bcd82SGustavo F. Padovan 		goto done;
284af6bcd82SGustavo F. Padovan 	}
285af6bcd82SGustavo F. Padovan 
2866b3af733SMarcel Holtmann 	if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
2876b3af733SMarcel Holtmann 		err = -EINVAL;
2886b3af733SMarcel Holtmann 		goto done;
2896b3af733SMarcel Holtmann 	}
2906b3af733SMarcel Holtmann 
2910c1bc5c6SGustavo F. Padovan 	switch (chan->mode) {
292af6bcd82SGustavo F. Padovan 	case L2CAP_MODE_BASIC:
29338319713SJohan Hedberg 	case L2CAP_MODE_LE_FLOWCTL:
2944be5ca67SLuiz Augusto von Dentz 		break;
29515f02b91SLuiz Augusto von Dentz 	case L2CAP_MODE_EXT_FLOWCTL:
2964be5ca67SLuiz Augusto von Dentz 		if (!enable_ecred) {
2974be5ca67SLuiz Augusto von Dentz 			err = -EOPNOTSUPP;
2984be5ca67SLuiz Augusto von Dentz 			goto done;
2994be5ca67SLuiz Augusto von Dentz 		}
300af6bcd82SGustavo F. Padovan 		break;
301af6bcd82SGustavo F. Padovan 	case L2CAP_MODE_ERTM:
302af6bcd82SGustavo F. Padovan 	case L2CAP_MODE_STREAMING:
303af6bcd82SGustavo F. Padovan 		if (!disable_ertm)
304af6bcd82SGustavo F. Padovan 			break;
30519186c7bSGustavo A. R. Silva 		fallthrough;
306af6bcd82SGustavo F. Padovan 	default:
307beb19e4cSJohan Hedberg 		err = -EOPNOTSUPP;
308af6bcd82SGustavo F. Padovan 		goto done;
309af6bcd82SGustavo F. Padovan 	}
310af6bcd82SGustavo F. Padovan 
311af6bcd82SGustavo F. Padovan 	sk->sk_max_ack_backlog = backlog;
312af6bcd82SGustavo F. Padovan 	sk->sk_ack_backlog = 0;
31389bc500eSGustavo F. Padovan 
314abe84903SJohan Hedberg 	/* Listening channels need to use nested locking in order not to
315abe84903SJohan Hedberg 	 * cause lockdep warnings when the created child channels end up
316abe84903SJohan Hedberg 	 * being locked in the same thread as the parent channel.
317abe84903SJohan Hedberg 	 */
318abe84903SJohan Hedberg 	atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
319abe84903SJohan Hedberg 
32089bc500eSGustavo F. Padovan 	chan->state = BT_LISTEN;
321af6bcd82SGustavo F. Padovan 	sk->sk_state = BT_LISTEN;
322af6bcd82SGustavo F. Padovan 
323af6bcd82SGustavo F. Padovan done:
324af6bcd82SGustavo F. Padovan 	release_sock(sk);
325af6bcd82SGustavo F. Padovan 	return err;
326af6bcd82SGustavo F. Padovan }
327af6bcd82SGustavo F. Padovan 
l2cap_sock_accept(struct socket * sock,struct socket * newsock,int flags,bool kern)3282d792818SGustavo Padovan static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
329cdfbabfbSDavid Howells 			     int flags, bool kern)
330c47b7c72SGustavo F. Padovan {
331dfb2fae7SPeter Hurley 	DEFINE_WAIT_FUNC(wait, woken_wake_function);
332c47b7c72SGustavo F. Padovan 	struct sock *sk = sock->sk, *nsk;
333c47b7c72SGustavo F. Padovan 	long timeo;
334c47b7c72SGustavo F. Padovan 	int err = 0;
335c47b7c72SGustavo F. Padovan 
3363b2ab39eSJohan Hedberg 	lock_sock_nested(sk, L2CAP_NESTING_PARENT);
337c47b7c72SGustavo F. Padovan 
338c47b7c72SGustavo F. Padovan 	timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
339c47b7c72SGustavo F. Padovan 
340c47b7c72SGustavo F. Padovan 	BT_DBG("sk %p timeo %ld", sk, timeo);
341c47b7c72SGustavo F. Padovan 
342c47b7c72SGustavo F. Padovan 	/* Wait for an incoming connection. (wake-one). */
343c47b7c72SGustavo F. Padovan 	add_wait_queue_exclusive(sk_sleep(sk), &wait);
344f9a3c20aSPeter Hurley 	while (1) {
345c47b7c72SGustavo F. Padovan 		if (sk->sk_state != BT_LISTEN) {
346c47b7c72SGustavo F. Padovan 			err = -EBADFD;
347c47b7c72SGustavo F. Padovan 			break;
348c47b7c72SGustavo F. Padovan 		}
349c47b7c72SGustavo F. Padovan 
350f9a3c20aSPeter Hurley 		nsk = bt_accept_dequeue(sk, newsock);
351f9a3c20aSPeter Hurley 		if (nsk)
352f9a3c20aSPeter Hurley 			break;
353f9a3c20aSPeter Hurley 
354f9a3c20aSPeter Hurley 		if (!timeo) {
355f9a3c20aSPeter Hurley 			err = -EAGAIN;
356f9a3c20aSPeter Hurley 			break;
357f9a3c20aSPeter Hurley 		}
358f9a3c20aSPeter Hurley 
359c47b7c72SGustavo F. Padovan 		if (signal_pending(current)) {
360c47b7c72SGustavo F. Padovan 			err = sock_intr_errno(timeo);
361c47b7c72SGustavo F. Padovan 			break;
362c47b7c72SGustavo F. Padovan 		}
363f9a3c20aSPeter Hurley 
364f9a3c20aSPeter Hurley 		release_sock(sk);
365dfb2fae7SPeter Hurley 
366dfb2fae7SPeter Hurley 		timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
367dfb2fae7SPeter Hurley 
3683b2ab39eSJohan Hedberg 		lock_sock_nested(sk, L2CAP_NESTING_PARENT);
369c47b7c72SGustavo F. Padovan 	}
370c47b7c72SGustavo F. Padovan 	remove_wait_queue(sk_sleep(sk), &wait);
371c47b7c72SGustavo F. Padovan 
372c47b7c72SGustavo F. Padovan 	if (err)
373c47b7c72SGustavo F. Padovan 		goto done;
374c47b7c72SGustavo F. Padovan 
375c47b7c72SGustavo F. Padovan 	newsock->state = SS_CONNECTED;
376c47b7c72SGustavo F. Padovan 
377c47b7c72SGustavo F. Padovan 	BT_DBG("new socket %p", nsk);
378c47b7c72SGustavo F. Padovan 
379c47b7c72SGustavo F. Padovan done:
380c47b7c72SGustavo F. Padovan 	release_sock(sk);
381c47b7c72SGustavo F. Padovan 	return err;
382c47b7c72SGustavo F. Padovan }
383c47b7c72SGustavo F. Padovan 
l2cap_sock_getname(struct socket * sock,struct sockaddr * addr,int peer)3842d792818SGustavo Padovan static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
3859b2c45d4SDenys Vlasenko 			      int peer)
386d7175d55SGustavo F. Padovan {
387d7175d55SGustavo F. Padovan 	struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
388d7175d55SGustavo F. Padovan 	struct sock *sk = sock->sk;
3890c1bc5c6SGustavo F. Padovan 	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
390d7175d55SGustavo F. Padovan 
391d7175d55SGustavo F. Padovan 	BT_DBG("sock %p, sk %p", sock, sk);
392d7175d55SGustavo F. Padovan 
393e8b1ab9eSJohan Hedberg 	if (peer && sk->sk_state != BT_CONNECTED &&
394bf19d51bSJohan Hedberg 	    sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2 &&
395bf19d51bSJohan Hedberg 	    sk->sk_state != BT_CONFIG)
396b783fbc3SJohan Hedberg 		return -ENOTCONN;
397b783fbc3SJohan Hedberg 
398792039c7SMathias Krause 	memset(la, 0, sizeof(struct sockaddr_l2));
399d7175d55SGustavo F. Padovan 	addr->sa_family = AF_BLUETOOTH;
400d7175d55SGustavo F. Padovan 
401fe4128e0SGustavo F. Padovan 	la->l2_psm = chan->psm;
402d7e5e76bSJohan Hedberg 
403d7e5e76bSJohan Hedberg 	if (peer) {
4047eafc59eSMarcel Holtmann 		bacpy(&la->l2_bdaddr, &chan->dst);
405fe4128e0SGustavo F. Padovan 		la->l2_cid = cpu_to_le16(chan->dcid);
4064f1654e0SMarcel Holtmann 		la->l2_bdaddr_type = chan->dst_type;
407d7175d55SGustavo F. Padovan 	} else {
4087eafc59eSMarcel Holtmann 		bacpy(&la->l2_bdaddr, &chan->src);
409fe4128e0SGustavo F. Padovan 		la->l2_cid = cpu_to_le16(chan->scid);
4104f1654e0SMarcel Holtmann 		la->l2_bdaddr_type = chan->src_type;
411d7175d55SGustavo F. Padovan 	}
412d7175d55SGustavo F. Padovan 
4139b2c45d4SDenys Vlasenko 	return sizeof(struct sockaddr_l2);
414d7175d55SGustavo F. Padovan }
415d7175d55SGustavo F. Padovan 
l2cap_get_mode(struct l2cap_chan * chan)4163ee7b7cdSLuiz Augusto von Dentz static int l2cap_get_mode(struct l2cap_chan *chan)
4173ee7b7cdSLuiz Augusto von Dentz {
4183ee7b7cdSLuiz Augusto von Dentz 	switch (chan->mode) {
4193ee7b7cdSLuiz Augusto von Dentz 	case L2CAP_MODE_BASIC:
4203ee7b7cdSLuiz Augusto von Dentz 		return BT_MODE_BASIC;
4213ee7b7cdSLuiz Augusto von Dentz 	case L2CAP_MODE_ERTM:
4223ee7b7cdSLuiz Augusto von Dentz 		return BT_MODE_ERTM;
4233ee7b7cdSLuiz Augusto von Dentz 	case L2CAP_MODE_STREAMING:
4243ee7b7cdSLuiz Augusto von Dentz 		return BT_MODE_STREAMING;
4253ee7b7cdSLuiz Augusto von Dentz 	case L2CAP_MODE_LE_FLOWCTL:
4263ee7b7cdSLuiz Augusto von Dentz 		return BT_MODE_LE_FLOWCTL;
4273ee7b7cdSLuiz Augusto von Dentz 	case L2CAP_MODE_EXT_FLOWCTL:
4283ee7b7cdSLuiz Augusto von Dentz 		return BT_MODE_EXT_FLOWCTL;
4293ee7b7cdSLuiz Augusto von Dentz 	}
4303ee7b7cdSLuiz Augusto von Dentz 
4313ee7b7cdSLuiz Augusto von Dentz 	return -EINVAL;
4323ee7b7cdSLuiz Augusto von Dentz }
4333ee7b7cdSLuiz Augusto von Dentz 
l2cap_sock_getsockopt_old(struct socket * sock,int optname,char __user * optval,int __user * optlen)4342d792818SGustavo Padovan static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
4352d792818SGustavo Padovan 				     char __user *optval, int __user *optlen)
43699f4808dSGustavo F. Padovan {
43799f4808dSGustavo F. Padovan 	struct sock *sk = sock->sk;
4384343478fSGustavo F. Padovan 	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
43999f4808dSGustavo F. Padovan 	struct l2cap_options opts;
44099f4808dSGustavo F. Padovan 	struct l2cap_conninfo cinfo;
4414eb706b1SNathan Chancellor 	int err = 0;
4424eb706b1SNathan Chancellor 	size_t len;
44399f4808dSGustavo F. Padovan 	u32 opt;
44499f4808dSGustavo F. Padovan 
44599f4808dSGustavo F. Padovan 	BT_DBG("sk %p", sk);
44699f4808dSGustavo F. Padovan 
44799f4808dSGustavo F. Padovan 	if (get_user(len, optlen))
44899f4808dSGustavo F. Padovan 		return -EFAULT;
44999f4808dSGustavo F. Padovan 
45099f4808dSGustavo F. Padovan 	lock_sock(sk);
45199f4808dSGustavo F. Padovan 
45299f4808dSGustavo F. Padovan 	switch (optname) {
45399f4808dSGustavo F. Padovan 	case L2CAP_OPTIONS:
45464b4f8dcSJohan Hedberg 		/* LE sockets should use BT_SNDMTU/BT_RCVMTU, but since
45564b4f8dcSJohan Hedberg 		 * legacy ATT code depends on getsockopt for
45664b4f8dcSJohan Hedberg 		 * L2CAP_OPTIONS we need to let this pass.
45764b4f8dcSJohan Hedberg 		 */
45864b4f8dcSJohan Hedberg 		if (bdaddr_type_is_le(chan->src_type) &&
45964b4f8dcSJohan Hedberg 		    chan->scid != L2CAP_CID_ATT) {
46064b4f8dcSJohan Hedberg 			err = -EINVAL;
46164b4f8dcSJohan Hedberg 			break;
46264b4f8dcSJohan Hedberg 		}
46364b4f8dcSJohan Hedberg 
464b86b0b15SLuiz Augusto von Dentz 		/* Only BR/EDR modes are supported here */
465b86b0b15SLuiz Augusto von Dentz 		switch (chan->mode) {
466b86b0b15SLuiz Augusto von Dentz 		case L2CAP_MODE_BASIC:
467b86b0b15SLuiz Augusto von Dentz 		case L2CAP_MODE_ERTM:
468b86b0b15SLuiz Augusto von Dentz 		case L2CAP_MODE_STREAMING:
469b86b0b15SLuiz Augusto von Dentz 			break;
470b86b0b15SLuiz Augusto von Dentz 		default:
471b86b0b15SLuiz Augusto von Dentz 			err = -EINVAL;
472b86b0b15SLuiz Augusto von Dentz 			break;
473b86b0b15SLuiz Augusto von Dentz 		}
474b86b0b15SLuiz Augusto von Dentz 
475b86b0b15SLuiz Augusto von Dentz 		if (err < 0)
476b86b0b15SLuiz Augusto von Dentz 			break;
477b86b0b15SLuiz Augusto von Dentz 
478e3fb592bSVasiliy Kulikov 		memset(&opts, 0, sizeof(opts));
4790c1bc5c6SGustavo F. Padovan 		opts.imtu     = chan->imtu;
4800c1bc5c6SGustavo F. Padovan 		opts.omtu     = chan->omtu;
4810c1bc5c6SGustavo F. Padovan 		opts.flush_to = chan->flush_to;
4820c1bc5c6SGustavo F. Padovan 		opts.mode     = chan->mode;
48347d1ec61SGustavo F. Padovan 		opts.fcs      = chan->fcs;
48447d1ec61SGustavo F. Padovan 		opts.max_tx   = chan->max_tx;
4856327eb98SAndrei Emeltchenko 		opts.txwin_size = chan->tx_win;
48699f4808dSGustavo F. Padovan 
48715f02b91SLuiz Augusto von Dentz 		BT_DBG("mode 0x%2.2x", chan->mode);
48815f02b91SLuiz Augusto von Dentz 
4894eb706b1SNathan Chancellor 		len = min(len, sizeof(opts));
49099f4808dSGustavo F. Padovan 		if (copy_to_user(optval, (char *) &opts, len))
49199f4808dSGustavo F. Padovan 			err = -EFAULT;
49299f4808dSGustavo F. Padovan 
49399f4808dSGustavo F. Padovan 		break;
49499f4808dSGustavo F. Padovan 
49599f4808dSGustavo F. Padovan 	case L2CAP_LM:
4964343478fSGustavo F. Padovan 		switch (chan->sec_level) {
49799f4808dSGustavo F. Padovan 		case BT_SECURITY_LOW:
49899f4808dSGustavo F. Padovan 			opt = L2CAP_LM_AUTH;
49999f4808dSGustavo F. Padovan 			break;
50099f4808dSGustavo F. Padovan 		case BT_SECURITY_MEDIUM:
50199f4808dSGustavo F. Padovan 			opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
50299f4808dSGustavo F. Padovan 			break;
50399f4808dSGustavo F. Padovan 		case BT_SECURITY_HIGH:
50499f4808dSGustavo F. Padovan 			opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
50599f4808dSGustavo F. Padovan 			      L2CAP_LM_SECURE;
50699f4808dSGustavo F. Padovan 			break;
5077d513e92SMarcel Holtmann 		case BT_SECURITY_FIPS:
5087d513e92SMarcel Holtmann 			opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
5097d513e92SMarcel Holtmann 			      L2CAP_LM_SECURE | L2CAP_LM_FIPS;
5107d513e92SMarcel Holtmann 			break;
51199f4808dSGustavo F. Padovan 		default:
51299f4808dSGustavo F. Padovan 			opt = 0;
51399f4808dSGustavo F. Padovan 			break;
51499f4808dSGustavo F. Padovan 		}
51599f4808dSGustavo F. Padovan 
51643bd0f32SAndrei Emeltchenko 		if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
51799f4808dSGustavo F. Padovan 			opt |= L2CAP_LM_MASTER;
51899f4808dSGustavo F. Padovan 
519ecf61bdbSAndrei Emeltchenko 		if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
52099f4808dSGustavo F. Padovan 			opt |= L2CAP_LM_RELIABLE;
52199f4808dSGustavo F. Padovan 
52299f4808dSGustavo F. Padovan 		if (put_user(opt, (u32 __user *) optval))
52399f4808dSGustavo F. Padovan 			err = -EFAULT;
5247d513e92SMarcel Holtmann 
52599f4808dSGustavo F. Padovan 		break;
52699f4808dSGustavo F. Padovan 
52799f4808dSGustavo F. Padovan 	case L2CAP_CONNINFO:
52899f4808dSGustavo F. Padovan 		if (sk->sk_state != BT_CONNECTED &&
52999f4808dSGustavo F. Padovan 		    !(sk->sk_state == BT_CONNECT2 &&
530c5daa683SGustavo Padovan 		      test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
53199f4808dSGustavo F. Padovan 			err = -ENOTCONN;
53299f4808dSGustavo F. Padovan 			break;
53399f4808dSGustavo F. Padovan 		}
53499f4808dSGustavo F. Padovan 
5358d03e971SFilip Palian 		memset(&cinfo, 0, sizeof(cinfo));
5368c1d787bSGustavo F. Padovan 		cinfo.hci_handle = chan->conn->hcon->handle;
5378c1d787bSGustavo F. Padovan 		memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
53899f4808dSGustavo F. Padovan 
5394eb706b1SNathan Chancellor 		len = min(len, sizeof(cinfo));
54099f4808dSGustavo F. Padovan 		if (copy_to_user(optval, (char *) &cinfo, len))
54199f4808dSGustavo F. Padovan 			err = -EFAULT;
54299f4808dSGustavo F. Padovan 
54399f4808dSGustavo F. Padovan 		break;
54499f4808dSGustavo F. Padovan 
54599f4808dSGustavo F. Padovan 	default:
54699f4808dSGustavo F. Padovan 		err = -ENOPROTOOPT;
54799f4808dSGustavo F. Padovan 		break;
54899f4808dSGustavo F. Padovan 	}
54999f4808dSGustavo F. Padovan 
55099f4808dSGustavo F. Padovan 	release_sock(sk);
55199f4808dSGustavo F. Padovan 	return err;
55299f4808dSGustavo F. Padovan }
55399f4808dSGustavo F. Padovan 
l2cap_sock_getsockopt(struct socket * sock,int level,int optname,char __user * optval,int __user * optlen)5542d792818SGustavo Padovan static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
5552d792818SGustavo Padovan 				 char __user *optval, int __user *optlen)
55699f4808dSGustavo F. Padovan {
55799f4808dSGustavo F. Padovan 	struct sock *sk = sock->sk;
5584343478fSGustavo F. Padovan 	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
55999f4808dSGustavo F. Padovan 	struct bt_security sec;
56014b12d0bSJaikumar Ganesh 	struct bt_power pwr;
561eab2404bSLuiz Augusto von Dentz 	u32 phys;
5623ee7b7cdSLuiz Augusto von Dentz 	int len, mode, err = 0;
56399f4808dSGustavo F. Padovan 
56499f4808dSGustavo F. Padovan 	BT_DBG("sk %p", sk);
56599f4808dSGustavo F. Padovan 
56699f4808dSGustavo F. Padovan 	if (level == SOL_L2CAP)
56799f4808dSGustavo F. Padovan 		return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
56899f4808dSGustavo F. Padovan 
56999f4808dSGustavo F. Padovan 	if (level != SOL_BLUETOOTH)
57099f4808dSGustavo F. Padovan 		return -ENOPROTOOPT;
57199f4808dSGustavo F. Padovan 
57299f4808dSGustavo F. Padovan 	if (get_user(len, optlen))
57399f4808dSGustavo F. Padovan 		return -EFAULT;
57499f4808dSGustavo F. Padovan 
57599f4808dSGustavo F. Padovan 	lock_sock(sk);
57699f4808dSGustavo F. Padovan 
57799f4808dSGustavo F. Padovan 	switch (optname) {
57899f4808dSGustavo F. Padovan 	case BT_SECURITY:
579715ec005SGustavo F. Padovan 		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
580e0c888adSJohan Hedberg 		    chan->chan_type != L2CAP_CHAN_FIXED &&
581715ec005SGustavo F. Padovan 		    chan->chan_type != L2CAP_CHAN_RAW) {
58299f4808dSGustavo F. Padovan 			err = -EINVAL;
58399f4808dSGustavo F. Padovan 			break;
58499f4808dSGustavo F. Padovan 		}
58599f4808dSGustavo F. Padovan 
5868f360119SVinicius Costa Gomes 		memset(&sec, 0, sizeof(sec));
58785e34368SAndrei Emeltchenko 		if (chan->conn) {
588c6585a4dSGustavo Padovan 			sec.level = chan->conn->hcon->sec_level;
58999f4808dSGustavo F. Padovan 
5908f360119SVinicius Costa Gomes 			if (sk->sk_state == BT_CONNECTED)
5918f360119SVinicius Costa Gomes 				sec.key_size = chan->conn->hcon->enc_key_size;
59285e34368SAndrei Emeltchenko 		} else {
59385e34368SAndrei Emeltchenko 			sec.level = chan->sec_level;
59485e34368SAndrei Emeltchenko 		}
5958f360119SVinicius Costa Gomes 
59699f4808dSGustavo F. Padovan 		len = min_t(unsigned int, len, sizeof(sec));
59799f4808dSGustavo F. Padovan 		if (copy_to_user(optval, (char *) &sec, len))
59899f4808dSGustavo F. Padovan 			err = -EFAULT;
59999f4808dSGustavo F. Padovan 
60099f4808dSGustavo F. Padovan 		break;
60199f4808dSGustavo F. Padovan 
60299f4808dSGustavo F. Padovan 	case BT_DEFER_SETUP:
60399f4808dSGustavo F. Padovan 		if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
60499f4808dSGustavo F. Padovan 			err = -EINVAL;
60599f4808dSGustavo F. Padovan 			break;
60699f4808dSGustavo F. Padovan 		}
60799f4808dSGustavo F. Padovan 
608c5daa683SGustavo Padovan 		if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
609c5daa683SGustavo Padovan 			     (u32 __user *) optval))
61099f4808dSGustavo F. Padovan 			err = -EFAULT;
61199f4808dSGustavo F. Padovan 
61299f4808dSGustavo F. Padovan 		break;
61399f4808dSGustavo F. Padovan 
61499f4808dSGustavo F. Padovan 	case BT_FLUSHABLE:
615d57b0e8bSAndrei Emeltchenko 		if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
616d57b0e8bSAndrei Emeltchenko 			     (u32 __user *) optval))
61799f4808dSGustavo F. Padovan 			err = -EFAULT;
61899f4808dSGustavo F. Padovan 
61999f4808dSGustavo F. Padovan 		break;
62099f4808dSGustavo F. Padovan 
62114b12d0bSJaikumar Ganesh 	case BT_POWER:
62214b12d0bSJaikumar Ganesh 		if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
62314b12d0bSJaikumar Ganesh 		    && sk->sk_type != SOCK_RAW) {
62414b12d0bSJaikumar Ganesh 			err = -EINVAL;
62514b12d0bSJaikumar Ganesh 			break;
62614b12d0bSJaikumar Ganesh 		}
62714b12d0bSJaikumar Ganesh 
62815770b1aSAndrei Emeltchenko 		pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
62914b12d0bSJaikumar Ganesh 
63014b12d0bSJaikumar Ganesh 		len = min_t(unsigned int, len, sizeof(pwr));
63114b12d0bSJaikumar Ganesh 		if (copy_to_user(optval, (char *) &pwr, len))
63214b12d0bSJaikumar Ganesh 			err = -EFAULT;
63314b12d0bSJaikumar Ganesh 
63414b12d0bSJaikumar Ganesh 		break;
63514b12d0bSJaikumar Ganesh 
6362ea66482SMat Martineau 	case BT_CHANNEL_POLICY:
6372ea66482SMat Martineau 		if (put_user(chan->chan_policy, (u32 __user *) optval))
6382ea66482SMat Martineau 			err = -EFAULT;
6392ea66482SMat Martineau 		break;
6402ea66482SMat Martineau 
6411f435424SJohan Hedberg 	case BT_SNDMTU:
6421f435424SJohan Hedberg 		if (!bdaddr_type_is_le(chan->src_type)) {
6431f435424SJohan Hedberg 			err = -EINVAL;
6441f435424SJohan Hedberg 			break;
6451f435424SJohan Hedberg 		}
6461f435424SJohan Hedberg 
6471f435424SJohan Hedberg 		if (sk->sk_state != BT_CONNECTED) {
6481f435424SJohan Hedberg 			err = -ENOTCONN;
6491f435424SJohan Hedberg 			break;
6501f435424SJohan Hedberg 		}
6511f435424SJohan Hedberg 
6521f435424SJohan Hedberg 		if (put_user(chan->omtu, (u16 __user *) optval))
6531f435424SJohan Hedberg 			err = -EFAULT;
6541f435424SJohan Hedberg 		break;
6551f435424SJohan Hedberg 
6561f435424SJohan Hedberg 	case BT_RCVMTU:
6571f435424SJohan Hedberg 		if (!bdaddr_type_is_le(chan->src_type)) {
6581f435424SJohan Hedberg 			err = -EINVAL;
6591f435424SJohan Hedberg 			break;
6601f435424SJohan Hedberg 		}
6611f435424SJohan Hedberg 
6621f435424SJohan Hedberg 		if (put_user(chan->imtu, (u16 __user *) optval))
6631f435424SJohan Hedberg 			err = -EFAULT;
6641f435424SJohan Hedberg 		break;
6651f435424SJohan Hedberg 
666eab2404bSLuiz Augusto von Dentz 	case BT_PHY:
667a2a8b0b4SLuiz Augusto von Dentz 		if (sk->sk_state != BT_CONNECTED) {
668eab2404bSLuiz Augusto von Dentz 			err = -ENOTCONN;
669eab2404bSLuiz Augusto von Dentz 			break;
670eab2404bSLuiz Augusto von Dentz 		}
671eab2404bSLuiz Augusto von Dentz 
672eab2404bSLuiz Augusto von Dentz 		phys = hci_conn_get_phy(chan->conn->hcon);
673eab2404bSLuiz Augusto von Dentz 
674eab2404bSLuiz Augusto von Dentz 		if (put_user(phys, (u32 __user *) optval))
675eab2404bSLuiz Augusto von Dentz 			err = -EFAULT;
676eab2404bSLuiz Augusto von Dentz 		break;
677eab2404bSLuiz Augusto von Dentz 
6783ee7b7cdSLuiz Augusto von Dentz 	case BT_MODE:
6793ee7b7cdSLuiz Augusto von Dentz 		if (!enable_ecred) {
6803ee7b7cdSLuiz Augusto von Dentz 			err = -ENOPROTOOPT;
6813ee7b7cdSLuiz Augusto von Dentz 			break;
6823ee7b7cdSLuiz Augusto von Dentz 		}
6833ee7b7cdSLuiz Augusto von Dentz 
6843ee7b7cdSLuiz Augusto von Dentz 		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
6853ee7b7cdSLuiz Augusto von Dentz 			err = -EINVAL;
6863ee7b7cdSLuiz Augusto von Dentz 			break;
6873ee7b7cdSLuiz Augusto von Dentz 		}
6883ee7b7cdSLuiz Augusto von Dentz 
6893ee7b7cdSLuiz Augusto von Dentz 		mode = l2cap_get_mode(chan);
6903ee7b7cdSLuiz Augusto von Dentz 		if (mode < 0) {
6913ee7b7cdSLuiz Augusto von Dentz 			err = mode;
6923ee7b7cdSLuiz Augusto von Dentz 			break;
6933ee7b7cdSLuiz Augusto von Dentz 		}
6943ee7b7cdSLuiz Augusto von Dentz 
6953ee7b7cdSLuiz Augusto von Dentz 		if (put_user(mode, (u8 __user *) optval))
6963ee7b7cdSLuiz Augusto von Dentz 			err = -EFAULT;
6973ee7b7cdSLuiz Augusto von Dentz 		break;
6983ee7b7cdSLuiz Augusto von Dentz 
69999f4808dSGustavo F. Padovan 	default:
70099f4808dSGustavo F. Padovan 		err = -ENOPROTOOPT;
70199f4808dSGustavo F. Padovan 		break;
70299f4808dSGustavo F. Padovan 	}
70399f4808dSGustavo F. Padovan 
70499f4808dSGustavo F. Padovan 	release_sock(sk);
70599f4808dSGustavo F. Padovan 	return err;
70699f4808dSGustavo F. Padovan }
70799f4808dSGustavo F. Padovan 
l2cap_valid_mtu(struct l2cap_chan * chan,u16 mtu)708682877c3SAndre Guedes static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
709682877c3SAndre Guedes {
710682877c3SAndre Guedes 	switch (chan->scid) {
711073d1cf3SJohan Hedberg 	case L2CAP_CID_ATT:
7128c3a4f00SAndre Guedes 		if (mtu < L2CAP_LE_MIN_MTU)
713682877c3SAndre Guedes 			return false;
714682877c3SAndre Guedes 		break;
715682877c3SAndre Guedes 
716682877c3SAndre Guedes 	default:
717682877c3SAndre Guedes 		if (mtu < L2CAP_DEFAULT_MIN_MTU)
718682877c3SAndre Guedes 			return false;
719682877c3SAndre Guedes 	}
720682877c3SAndre Guedes 
721682877c3SAndre Guedes 	return true;
722682877c3SAndre Guedes }
723682877c3SAndre Guedes 
l2cap_sock_setsockopt_old(struct socket * sock,int optname,sockptr_t optval,unsigned int optlen)7242d792818SGustavo Padovan static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
725a7b75c5aSChristoph Hellwig 				     sockptr_t optval, unsigned int optlen)
72633575df7SGustavo F. Padovan {
72733575df7SGustavo F. Padovan 	struct sock *sk = sock->sk;
728b4450035SGustavo F. Padovan 	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
72933575df7SGustavo F. Padovan 	struct l2cap_options opts;
73033575df7SGustavo F. Padovan 	int len, err = 0;
73133575df7SGustavo F. Padovan 	u32 opt;
73233575df7SGustavo F. Padovan 
73333575df7SGustavo F. Padovan 	BT_DBG("sk %p", sk);
73433575df7SGustavo F. Padovan 
73533575df7SGustavo F. Padovan 	lock_sock(sk);
73633575df7SGustavo F. Padovan 
73733575df7SGustavo F. Padovan 	switch (optname) {
73833575df7SGustavo F. Padovan 	case L2CAP_OPTIONS:
73964b4f8dcSJohan Hedberg 		if (bdaddr_type_is_le(chan->src_type)) {
74064b4f8dcSJohan Hedberg 			err = -EINVAL;
74164b4f8dcSJohan Hedberg 			break;
74264b4f8dcSJohan Hedberg 		}
74364b4f8dcSJohan Hedberg 
74433575df7SGustavo F. Padovan 		if (sk->sk_state == BT_CONNECTED) {
74533575df7SGustavo F. Padovan 			err = -EINVAL;
74633575df7SGustavo F. Padovan 			break;
74733575df7SGustavo F. Padovan 		}
74833575df7SGustavo F. Padovan 
7490c1bc5c6SGustavo F. Padovan 		opts.imtu     = chan->imtu;
7500c1bc5c6SGustavo F. Padovan 		opts.omtu     = chan->omtu;
7510c1bc5c6SGustavo F. Padovan 		opts.flush_to = chan->flush_to;
7520c1bc5c6SGustavo F. Padovan 		opts.mode     = chan->mode;
75347d1ec61SGustavo F. Padovan 		opts.fcs      = chan->fcs;
75447d1ec61SGustavo F. Padovan 		opts.max_tx   = chan->max_tx;
7556327eb98SAndrei Emeltchenko 		opts.txwin_size = chan->tx_win;
75633575df7SGustavo F. Padovan 
75733575df7SGustavo F. Padovan 		len = min_t(unsigned int, sizeof(opts), optlen);
758a7b75c5aSChristoph Hellwig 		if (copy_from_sockptr(&opts, optval, len)) {
75933575df7SGustavo F. Padovan 			err = -EFAULT;
76033575df7SGustavo F. Padovan 			break;
76133575df7SGustavo F. Padovan 		}
76233575df7SGustavo F. Padovan 
7636327eb98SAndrei Emeltchenko 		if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
76433575df7SGustavo F. Padovan 			err = -EINVAL;
76533575df7SGustavo F. Padovan 			break;
76633575df7SGustavo F. Padovan 		}
76733575df7SGustavo F. Padovan 
768682877c3SAndre Guedes 		if (!l2cap_valid_mtu(chan, opts.imtu)) {
769682877c3SAndre Guedes 			err = -EINVAL;
770682877c3SAndre Guedes 			break;
771682877c3SAndre Guedes 		}
772682877c3SAndre Guedes 
773b86b0b15SLuiz Augusto von Dentz 		/* Only BR/EDR modes are supported here */
774b86b0b15SLuiz Augusto von Dentz 		switch (opts.mode) {
77533575df7SGustavo F. Padovan 		case L2CAP_MODE_BASIC:
776c1360a1cSGustavo F. Padovan 			clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
77733575df7SGustavo F. Padovan 			break;
77833575df7SGustavo F. Padovan 		case L2CAP_MODE_ERTM:
77933575df7SGustavo F. Padovan 		case L2CAP_MODE_STREAMING:
78033575df7SGustavo F. Padovan 			if (!disable_ertm)
78133575df7SGustavo F. Padovan 				break;
78219186c7bSGustavo A. R. Silva 			fallthrough;
78333575df7SGustavo F. Padovan 		default:
78433575df7SGustavo F. Padovan 			err = -EINVAL;
78533575df7SGustavo F. Padovan 			break;
78633575df7SGustavo F. Padovan 		}
78733575df7SGustavo F. Padovan 
788b86b0b15SLuiz Augusto von Dentz 		if (err < 0)
789b86b0b15SLuiz Augusto von Dentz 			break;
790b86b0b15SLuiz Augusto von Dentz 
791b86b0b15SLuiz Augusto von Dentz 		chan->mode = opts.mode;
792b86b0b15SLuiz Augusto von Dentz 
79315f02b91SLuiz Augusto von Dentz 		BT_DBG("mode 0x%2.2x", chan->mode);
79415f02b91SLuiz Augusto von Dentz 
7950c1bc5c6SGustavo F. Padovan 		chan->imtu = opts.imtu;
7960c1bc5c6SGustavo F. Padovan 		chan->omtu = opts.omtu;
79747d1ec61SGustavo F. Padovan 		chan->fcs  = opts.fcs;
79847d1ec61SGustavo F. Padovan 		chan->max_tx = opts.max_tx;
7996327eb98SAndrei Emeltchenko 		chan->tx_win = opts.txwin_size;
80012d59781SAndrei Emeltchenko 		chan->flush_to = opts.flush_to;
80133575df7SGustavo F. Padovan 		break;
80233575df7SGustavo F. Padovan 
80333575df7SGustavo F. Padovan 	case L2CAP_LM:
804a7b75c5aSChristoph Hellwig 		if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
80533575df7SGustavo F. Padovan 			err = -EFAULT;
80633575df7SGustavo F. Padovan 			break;
80733575df7SGustavo F. Padovan 		}
80833575df7SGustavo F. Padovan 
8097d513e92SMarcel Holtmann 		if (opt & L2CAP_LM_FIPS) {
8107d513e92SMarcel Holtmann 			err = -EINVAL;
8117d513e92SMarcel Holtmann 			break;
8127d513e92SMarcel Holtmann 		}
8137d513e92SMarcel Holtmann 
81433575df7SGustavo F. Padovan 		if (opt & L2CAP_LM_AUTH)
8154343478fSGustavo F. Padovan 			chan->sec_level = BT_SECURITY_LOW;
81633575df7SGustavo F. Padovan 		if (opt & L2CAP_LM_ENCRYPT)
8174343478fSGustavo F. Padovan 			chan->sec_level = BT_SECURITY_MEDIUM;
81833575df7SGustavo F. Padovan 		if (opt & L2CAP_LM_SECURE)
8194343478fSGustavo F. Padovan 			chan->sec_level = BT_SECURITY_HIGH;
82033575df7SGustavo F. Padovan 
82143bd0f32SAndrei Emeltchenko 		if (opt & L2CAP_LM_MASTER)
82243bd0f32SAndrei Emeltchenko 			set_bit(FLAG_ROLE_SWITCH, &chan->flags);
82343bd0f32SAndrei Emeltchenko 		else
82443bd0f32SAndrei Emeltchenko 			clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
825ecf61bdbSAndrei Emeltchenko 
826ecf61bdbSAndrei Emeltchenko 		if (opt & L2CAP_LM_RELIABLE)
827ecf61bdbSAndrei Emeltchenko 			set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
828ecf61bdbSAndrei Emeltchenko 		else
829ecf61bdbSAndrei Emeltchenko 			clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
83033575df7SGustavo F. Padovan 		break;
83133575df7SGustavo F. Padovan 
83233575df7SGustavo F. Padovan 	default:
83333575df7SGustavo F. Padovan 		err = -ENOPROTOOPT;
83433575df7SGustavo F. Padovan 		break;
83533575df7SGustavo F. Padovan 	}
83633575df7SGustavo F. Padovan 
83733575df7SGustavo F. Padovan 	release_sock(sk);
83833575df7SGustavo F. Padovan 	return err;
83933575df7SGustavo F. Padovan }
84033575df7SGustavo F. Padovan 
l2cap_set_mode(struct l2cap_chan * chan,u8 mode)8413ee7b7cdSLuiz Augusto von Dentz static int l2cap_set_mode(struct l2cap_chan *chan, u8 mode)
8423ee7b7cdSLuiz Augusto von Dentz {
8433ee7b7cdSLuiz Augusto von Dentz 	switch (mode) {
8443ee7b7cdSLuiz Augusto von Dentz 	case BT_MODE_BASIC:
8453ee7b7cdSLuiz Augusto von Dentz 		if (bdaddr_type_is_le(chan->src_type))
8463ee7b7cdSLuiz Augusto von Dentz 			return -EINVAL;
8473ee7b7cdSLuiz Augusto von Dentz 		mode = L2CAP_MODE_BASIC;
8483ee7b7cdSLuiz Augusto von Dentz 		clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
8493ee7b7cdSLuiz Augusto von Dentz 		break;
8503ee7b7cdSLuiz Augusto von Dentz 	case BT_MODE_ERTM:
8513ee7b7cdSLuiz Augusto von Dentz 		if (!disable_ertm || bdaddr_type_is_le(chan->src_type))
8523ee7b7cdSLuiz Augusto von Dentz 			return -EINVAL;
8533ee7b7cdSLuiz Augusto von Dentz 		mode = L2CAP_MODE_ERTM;
8543ee7b7cdSLuiz Augusto von Dentz 		break;
8553ee7b7cdSLuiz Augusto von Dentz 	case BT_MODE_STREAMING:
8563ee7b7cdSLuiz Augusto von Dentz 		if (!disable_ertm || bdaddr_type_is_le(chan->src_type))
8573ee7b7cdSLuiz Augusto von Dentz 			return -EINVAL;
8583ee7b7cdSLuiz Augusto von Dentz 		mode = L2CAP_MODE_STREAMING;
8593ee7b7cdSLuiz Augusto von Dentz 		break;
8603ee7b7cdSLuiz Augusto von Dentz 	case BT_MODE_LE_FLOWCTL:
8613ee7b7cdSLuiz Augusto von Dentz 		if (!bdaddr_type_is_le(chan->src_type))
8623ee7b7cdSLuiz Augusto von Dentz 			return -EINVAL;
8633ee7b7cdSLuiz Augusto von Dentz 		mode = L2CAP_MODE_LE_FLOWCTL;
8643ee7b7cdSLuiz Augusto von Dentz 		break;
8653ee7b7cdSLuiz Augusto von Dentz 	case BT_MODE_EXT_FLOWCTL:
8663ee7b7cdSLuiz Augusto von Dentz 		/* TODO: Add support for ECRED PDUs to BR/EDR */
8673ee7b7cdSLuiz Augusto von Dentz 		if (!bdaddr_type_is_le(chan->src_type))
8683ee7b7cdSLuiz Augusto von Dentz 			return -EINVAL;
8693ee7b7cdSLuiz Augusto von Dentz 		mode = L2CAP_MODE_EXT_FLOWCTL;
8703ee7b7cdSLuiz Augusto von Dentz 		break;
8713ee7b7cdSLuiz Augusto von Dentz 	default:
8723ee7b7cdSLuiz Augusto von Dentz 		return -EINVAL;
8733ee7b7cdSLuiz Augusto von Dentz 	}
8743ee7b7cdSLuiz Augusto von Dentz 
8753ee7b7cdSLuiz Augusto von Dentz 	chan->mode = mode;
8763ee7b7cdSLuiz Augusto von Dentz 
8773ee7b7cdSLuiz Augusto von Dentz 	return 0;
8783ee7b7cdSLuiz Augusto von Dentz }
8793ee7b7cdSLuiz Augusto von Dentz 
l2cap_sock_setsockopt(struct socket * sock,int level,int optname,sockptr_t optval,unsigned int optlen)8802d792818SGustavo Padovan static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
881a7b75c5aSChristoph Hellwig 				 sockptr_t optval, unsigned int optlen)
88233575df7SGustavo F. Padovan {
88333575df7SGustavo F. Padovan 	struct sock *sk = sock->sk;
8844343478fSGustavo F. Padovan 	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
88533575df7SGustavo F. Padovan 	struct bt_security sec;
88614b12d0bSJaikumar Ganesh 	struct bt_power pwr;
887f1cb9af5SVinicius Costa Gomes 	struct l2cap_conn *conn;
88833575df7SGustavo F. Padovan 	int len, err = 0;
88933575df7SGustavo F. Padovan 	u32 opt;
8902b70d4f9SDan Carpenter 	u16 mtu;
8912b70d4f9SDan Carpenter 	u8 mode;
89233575df7SGustavo F. Padovan 
89333575df7SGustavo F. Padovan 	BT_DBG("sk %p", sk);
89433575df7SGustavo F. Padovan 
89533575df7SGustavo F. Padovan 	if (level == SOL_L2CAP)
89633575df7SGustavo F. Padovan 		return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
89733575df7SGustavo F. Padovan 
89833575df7SGustavo F. Padovan 	if (level != SOL_BLUETOOTH)
89933575df7SGustavo F. Padovan 		return -ENOPROTOOPT;
90033575df7SGustavo F. Padovan 
90133575df7SGustavo F. Padovan 	lock_sock(sk);
90233575df7SGustavo F. Padovan 
90333575df7SGustavo F. Padovan 	switch (optname) {
90433575df7SGustavo F. Padovan 	case BT_SECURITY:
905715ec005SGustavo F. Padovan 		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
906e0c888adSJohan Hedberg 		    chan->chan_type != L2CAP_CHAN_FIXED &&
907715ec005SGustavo F. Padovan 		    chan->chan_type != L2CAP_CHAN_RAW) {
90833575df7SGustavo F. Padovan 			err = -EINVAL;
90933575df7SGustavo F. Padovan 			break;
91033575df7SGustavo F. Padovan 		}
91133575df7SGustavo F. Padovan 
91233575df7SGustavo F. Padovan 		sec.level = BT_SECURITY_LOW;
91333575df7SGustavo F. Padovan 
91433575df7SGustavo F. Padovan 		len = min_t(unsigned int, sizeof(sec), optlen);
915a7b75c5aSChristoph Hellwig 		if (copy_from_sockptr(&sec, optval, len)) {
91633575df7SGustavo F. Padovan 			err = -EFAULT;
91733575df7SGustavo F. Padovan 			break;
91833575df7SGustavo F. Padovan 		}
91933575df7SGustavo F. Padovan 
92033575df7SGustavo F. Padovan 		if (sec.level < BT_SECURITY_LOW ||
921a164cee1SPatrik Flykt 		    sec.level > BT_SECURITY_FIPS) {
92233575df7SGustavo F. Padovan 			err = -EINVAL;
92333575df7SGustavo F. Padovan 			break;
92433575df7SGustavo F. Padovan 		}
92533575df7SGustavo F. Padovan 
9264343478fSGustavo F. Padovan 		chan->sec_level = sec.level;
927f1cb9af5SVinicius Costa Gomes 
9280bee1d60SGustavo F. Padovan 		if (!chan->conn)
9290bee1d60SGustavo F. Padovan 			break;
9300bee1d60SGustavo F. Padovan 
931f1cb9af5SVinicius Costa Gomes 		conn = chan->conn;
9320bee1d60SGustavo F. Padovan 
9330bee1d60SGustavo F. Padovan 		/* change security for LE channels */
934073d1cf3SJohan Hedberg 		if (chan->scid == L2CAP_CID_ATT) {
935bbb69b37SFugang Duan 			if (smp_conn_security(conn->hcon, sec.level)) {
936bbb69b37SFugang Duan 				err = -EINVAL;
937f1cb9af5SVinicius Costa Gomes 				break;
938bbb69b37SFugang Duan 			}
939bbb69b37SFugang Duan 
940d52deb17SJohan Hedberg 			set_bit(FLAG_PENDING_SECURITY, &chan->flags);
941f1cb9af5SVinicius Costa Gomes 			sk->sk_state = BT_CONFIG;
9423542b854SGustavo F. Padovan 			chan->state = BT_CONFIG;
9430bee1d60SGustavo F. Padovan 
944a7d7723aSGustavo Padovan 		/* or for ACL link */
945a7d7723aSGustavo Padovan 		} else if ((sk->sk_state == BT_CONNECT2 &&
946c5daa683SGustavo Padovan 			    test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
947a7d7723aSGustavo Padovan 			   sk->sk_state == BT_CONNECTED) {
948e7cafc45SJohan Hedberg 			if (!l2cap_chan_check_security(chan, true))
949c5daa683SGustavo Padovan 				set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
950a7d7723aSGustavo Padovan 			else
951a7d7723aSGustavo Padovan 				sk->sk_state_change(sk);
9520bee1d60SGustavo F. Padovan 		} else {
9530bee1d60SGustavo F. Padovan 			err = -EINVAL;
954f1cb9af5SVinicius Costa Gomes 		}
95533575df7SGustavo F. Padovan 		break;
95633575df7SGustavo F. Padovan 
95733575df7SGustavo F. Padovan 	case BT_DEFER_SETUP:
95833575df7SGustavo F. Padovan 		if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
95933575df7SGustavo F. Padovan 			err = -EINVAL;
96033575df7SGustavo F. Padovan 			break;
96133575df7SGustavo F. Padovan 		}
96233575df7SGustavo F. Padovan 
963a7b75c5aSChristoph Hellwig 		if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
96433575df7SGustavo F. Padovan 			err = -EFAULT;
96533575df7SGustavo F. Padovan 			break;
96633575df7SGustavo F. Padovan 		}
96733575df7SGustavo F. Padovan 
968bdc25783SMarcel Holtmann 		if (opt) {
969c5daa683SGustavo Padovan 			set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
970bdc25783SMarcel Holtmann 			set_bit(FLAG_DEFER_SETUP, &chan->flags);
971bdc25783SMarcel Holtmann 		} else {
972c5daa683SGustavo Padovan 			clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
973bdc25783SMarcel Holtmann 			clear_bit(FLAG_DEFER_SETUP, &chan->flags);
974bdc25783SMarcel Holtmann 		}
97533575df7SGustavo F. Padovan 		break;
97633575df7SGustavo F. Padovan 
97733575df7SGustavo F. Padovan 	case BT_FLUSHABLE:
978a7b75c5aSChristoph Hellwig 		if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
97933575df7SGustavo F. Padovan 			err = -EFAULT;
98033575df7SGustavo F. Padovan 			break;
98133575df7SGustavo F. Padovan 		}
98233575df7SGustavo F. Padovan 
98333575df7SGustavo F. Padovan 		if (opt > BT_FLUSHABLE_ON) {
98433575df7SGustavo F. Padovan 			err = -EINVAL;
98533575df7SGustavo F. Padovan 			break;
98633575df7SGustavo F. Padovan 		}
98733575df7SGustavo F. Padovan 
98833575df7SGustavo F. Padovan 		if (opt == BT_FLUSHABLE_OFF) {
989c1f23a2bSJohannes Berg 			conn = chan->conn;
99025985edcSLucas De Marchi 			/* proceed further only when we have l2cap_conn and
99133575df7SGustavo F. Padovan 			   No Flush support in the LM */
99233575df7SGustavo F. Padovan 			if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
99333575df7SGustavo F. Padovan 				err = -EINVAL;
99433575df7SGustavo F. Padovan 				break;
99533575df7SGustavo F. Padovan 			}
99633575df7SGustavo F. Padovan 		}
99733575df7SGustavo F. Padovan 
998d57b0e8bSAndrei Emeltchenko 		if (opt)
999d57b0e8bSAndrei Emeltchenko 			set_bit(FLAG_FLUSHABLE, &chan->flags);
1000d57b0e8bSAndrei Emeltchenko 		else
1001d57b0e8bSAndrei Emeltchenko 			clear_bit(FLAG_FLUSHABLE, &chan->flags);
100233575df7SGustavo F. Padovan 		break;
100333575df7SGustavo F. Padovan 
100414b12d0bSJaikumar Ganesh 	case BT_POWER:
100514b12d0bSJaikumar Ganesh 		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
100614b12d0bSJaikumar Ganesh 		    chan->chan_type != L2CAP_CHAN_RAW) {
100714b12d0bSJaikumar Ganesh 			err = -EINVAL;
100814b12d0bSJaikumar Ganesh 			break;
100914b12d0bSJaikumar Ganesh 		}
101014b12d0bSJaikumar Ganesh 
101114b12d0bSJaikumar Ganesh 		pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
101214b12d0bSJaikumar Ganesh 
101314b12d0bSJaikumar Ganesh 		len = min_t(unsigned int, sizeof(pwr), optlen);
1014a7b75c5aSChristoph Hellwig 		if (copy_from_sockptr(&pwr, optval, len)) {
101514b12d0bSJaikumar Ganesh 			err = -EFAULT;
101614b12d0bSJaikumar Ganesh 			break;
101714b12d0bSJaikumar Ganesh 		}
101815770b1aSAndrei Emeltchenko 
101915770b1aSAndrei Emeltchenko 		if (pwr.force_active)
102015770b1aSAndrei Emeltchenko 			set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
102115770b1aSAndrei Emeltchenko 		else
102215770b1aSAndrei Emeltchenko 			clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
102314b12d0bSJaikumar Ganesh 		break;
102414b12d0bSJaikumar Ganesh 
10252ea66482SMat Martineau 	case BT_CHANNEL_POLICY:
1026a7b75c5aSChristoph Hellwig 		if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
10272ea66482SMat Martineau 			err = -EFAULT;
10282ea66482SMat Martineau 			break;
10292ea66482SMat Martineau 		}
10302ea66482SMat Martineau 
10312ea66482SMat Martineau 		err = -EOPNOTSUPP;
10322ea66482SMat Martineau 		break;
103333575df7SGustavo F. Padovan 
10341f435424SJohan Hedberg 	case BT_SNDMTU:
10351f435424SJohan Hedberg 		if (!bdaddr_type_is_le(chan->src_type)) {
10361f435424SJohan Hedberg 			err = -EINVAL;
10371f435424SJohan Hedberg 			break;
10381f435424SJohan Hedberg 		}
10391f435424SJohan Hedberg 
10401f435424SJohan Hedberg 		/* Setting is not supported as it's the remote side that
10411f435424SJohan Hedberg 		 * decides this.
10421f435424SJohan Hedberg 		 */
10431f435424SJohan Hedberg 		err = -EPERM;
10441f435424SJohan Hedberg 		break;
10451f435424SJohan Hedberg 
10461f435424SJohan Hedberg 	case BT_RCVMTU:
10471f435424SJohan Hedberg 		if (!bdaddr_type_is_le(chan->src_type)) {
10481f435424SJohan Hedberg 			err = -EINVAL;
10491f435424SJohan Hedberg 			break;
10501f435424SJohan Hedberg 		}
10511f435424SJohan Hedberg 
105215f02b91SLuiz Augusto von Dentz 		if (chan->mode == L2CAP_MODE_LE_FLOWCTL &&
105315f02b91SLuiz Augusto von Dentz 		    sk->sk_state == BT_CONNECTED) {
10541f435424SJohan Hedberg 			err = -EISCONN;
10551f435424SJohan Hedberg 			break;
10561f435424SJohan Hedberg 		}
10571f435424SJohan Hedberg 
10582b70d4f9SDan Carpenter 		if (copy_from_sockptr(&mtu, optval, sizeof(u16))) {
10591f435424SJohan Hedberg 			err = -EFAULT;
10601f435424SJohan Hedberg 			break;
10611f435424SJohan Hedberg 		}
10621f435424SJohan Hedberg 
106315f02b91SLuiz Augusto von Dentz 		if (chan->mode == L2CAP_MODE_EXT_FLOWCTL &&
106415f02b91SLuiz Augusto von Dentz 		    sk->sk_state == BT_CONNECTED)
10652b70d4f9SDan Carpenter 			err = l2cap_chan_reconfigure(chan, mtu);
106615f02b91SLuiz Augusto von Dentz 		else
10672b70d4f9SDan Carpenter 			chan->imtu = mtu;
106815f02b91SLuiz Augusto von Dentz 
10691f435424SJohan Hedberg 		break;
10701f435424SJohan Hedberg 
10713ee7b7cdSLuiz Augusto von Dentz 	case BT_MODE:
10723ee7b7cdSLuiz Augusto von Dentz 		if (!enable_ecred) {
10733ee7b7cdSLuiz Augusto von Dentz 			err = -ENOPROTOOPT;
10743ee7b7cdSLuiz Augusto von Dentz 			break;
10753ee7b7cdSLuiz Augusto von Dentz 		}
10763ee7b7cdSLuiz Augusto von Dentz 
10773ee7b7cdSLuiz Augusto von Dentz 		BT_DBG("sk->sk_state %u", sk->sk_state);
10783ee7b7cdSLuiz Augusto von Dentz 
10793ee7b7cdSLuiz Augusto von Dentz 		if (sk->sk_state != BT_BOUND) {
10803ee7b7cdSLuiz Augusto von Dentz 			err = -EINVAL;
10813ee7b7cdSLuiz Augusto von Dentz 			break;
10823ee7b7cdSLuiz Augusto von Dentz 		}
10833ee7b7cdSLuiz Augusto von Dentz 
10843ee7b7cdSLuiz Augusto von Dentz 		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
10853ee7b7cdSLuiz Augusto von Dentz 			err = -EINVAL;
10863ee7b7cdSLuiz Augusto von Dentz 			break;
10873ee7b7cdSLuiz Augusto von Dentz 		}
10883ee7b7cdSLuiz Augusto von Dentz 
10892b70d4f9SDan Carpenter 		if (copy_from_sockptr(&mode, optval, sizeof(u8))) {
10903ee7b7cdSLuiz Augusto von Dentz 			err = -EFAULT;
10913ee7b7cdSLuiz Augusto von Dentz 			break;
10923ee7b7cdSLuiz Augusto von Dentz 		}
10933ee7b7cdSLuiz Augusto von Dentz 
10942b70d4f9SDan Carpenter 		BT_DBG("mode %u", mode);
10953ee7b7cdSLuiz Augusto von Dentz 
10962b70d4f9SDan Carpenter 		err = l2cap_set_mode(chan, mode);
10973ee7b7cdSLuiz Augusto von Dentz 		if (err)
10983ee7b7cdSLuiz Augusto von Dentz 			break;
10993ee7b7cdSLuiz Augusto von Dentz 
11003ee7b7cdSLuiz Augusto von Dentz 		BT_DBG("mode 0x%2.2x", chan->mode);
11013ee7b7cdSLuiz Augusto von Dentz 
11023ee7b7cdSLuiz Augusto von Dentz 		break;
11033ee7b7cdSLuiz Augusto von Dentz 
110433575df7SGustavo F. Padovan 	default:
110533575df7SGustavo F. Padovan 		err = -ENOPROTOOPT;
110633575df7SGustavo F. Padovan 		break;
110733575df7SGustavo F. Padovan 	}
110833575df7SGustavo F. Padovan 
110933575df7SGustavo F. Padovan 	release_sock(sk);
111033575df7SGustavo F. Padovan 	return err;
111133575df7SGustavo F. Padovan }
111233575df7SGustavo F. Padovan 
l2cap_sock_sendmsg(struct socket * sock,struct msghdr * msg,size_t len)11131b784140SYing Xue static int l2cap_sock_sendmsg(struct socket *sock, struct msghdr *msg,
11141b784140SYing Xue 			      size_t len)
1115fd83ccdbSGustavo F. Padovan {
1116fd83ccdbSGustavo F. Padovan 	struct sock *sk = sock->sk;
11170c1bc5c6SGustavo F. Padovan 	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1118fd83ccdbSGustavo F. Padovan 	int err;
1119fd83ccdbSGustavo F. Padovan 
1120fd83ccdbSGustavo F. Padovan 	BT_DBG("sock %p, sk %p", sock, sk);
1121fd83ccdbSGustavo F. Padovan 
1122fd83ccdbSGustavo F. Padovan 	err = sock_error(sk);
1123fd83ccdbSGustavo F. Padovan 	if (err)
1124fd83ccdbSGustavo F. Padovan 		return err;
1125fd83ccdbSGustavo F. Padovan 
1126fd83ccdbSGustavo F. Padovan 	if (msg->msg_flags & MSG_OOB)
1127fd83ccdbSGustavo F. Padovan 		return -EOPNOTSUPP;
1128fd83ccdbSGustavo F. Padovan 
1129a6a5568cSMat Martineau 	if (sk->sk_state != BT_CONNECTED)
11309a91a04aSGustavo F. Padovan 		return -ENOTCONN;
1131fd83ccdbSGustavo F. Padovan 
1132e793dcf0SJohan Hedberg 	lock_sock(sk);
1133e793dcf0SJohan Hedberg 	err = bt_sock_wait_ready(sk, msg->msg_flags);
1134e793dcf0SJohan Hedberg 	release_sock(sk);
1135e793dcf0SJohan Hedberg 	if (err)
1136e793dcf0SJohan Hedberg 		return err;
1137e793dcf0SJohan Hedberg 
1138a6a5568cSMat Martineau 	l2cap_chan_lock(chan);
11398d46321cSMarcel Holtmann 	err = l2cap_chan_send(chan, msg, len);
1140a6a5568cSMat Martineau 	l2cap_chan_unlock(chan);
1141fd83ccdbSGustavo F. Padovan 
1142fd83ccdbSGustavo F. Padovan 	return err;
1143fd83ccdbSGustavo F. Padovan }
1144fd83ccdbSGustavo F. Padovan 
l2cap_sock_recvmsg(struct socket * sock,struct msghdr * msg,size_t len,int flags)11451b784140SYing Xue static int l2cap_sock_recvmsg(struct socket *sock, struct msghdr *msg,
11461b784140SYing Xue 			      size_t len, int flags)
114768983259SGustavo F. Padovan {
114868983259SGustavo F. Padovan 	struct sock *sk = sock->sk;
1149e328140fSMat Martineau 	struct l2cap_pinfo *pi = l2cap_pi(sk);
1150e328140fSMat Martineau 	int err;
115168983259SGustavo F. Padovan 
115268983259SGustavo F. Padovan 	lock_sock(sk);
115368983259SGustavo F. Padovan 
1154c5daa683SGustavo Padovan 	if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
1155c5daa683SGustavo Padovan 						    &bt_sk(sk)->flags)) {
115615f02b91SLuiz Augusto von Dentz 		if (pi->chan->mode == L2CAP_MODE_EXT_FLOWCTL) {
115715f02b91SLuiz Augusto von Dentz 			sk->sk_state = BT_CONNECTED;
115815f02b91SLuiz Augusto von Dentz 			pi->chan->state = BT_CONNECTED;
115915f02b91SLuiz Augusto von Dentz 			__l2cap_ecred_conn_rsp_defer(pi->chan);
1160b354e6c1SDan Carpenter 		} else if (bdaddr_type_is_le(pi->chan->src_type)) {
116138319713SJohan Hedberg 			sk->sk_state = BT_CONNECTED;
116238319713SJohan Hedberg 			pi->chan->state = BT_CONNECTED;
116338319713SJohan Hedberg 			__l2cap_le_connect_rsp_defer(pi->chan);
116438319713SJohan Hedberg 		} else {
11658c1d787bSGustavo F. Padovan 			sk->sk_state = BT_CONFIG;
11663542b854SGustavo F. Padovan 			pi->chan->state = BT_CONFIG;
1167e328140fSMat Martineau 			__l2cap_connect_rsp_defer(pi->chan);
116838319713SJohan Hedberg 		}
116938319713SJohan Hedberg 
1170970871bcSJohan Hedberg 		err = 0;
1171970871bcSJohan Hedberg 		goto done;
117268983259SGustavo F. Padovan 	}
117368983259SGustavo F. Padovan 
117468983259SGustavo F. Padovan 	release_sock(sk);
117568983259SGustavo F. Padovan 
117668983259SGustavo F. Padovan 	if (sock->type == SOCK_STREAM)
11771b784140SYing Xue 		err = bt_sock_stream_recvmsg(sock, msg, len, flags);
1178e328140fSMat Martineau 	else
11791b784140SYing Xue 		err = bt_sock_recvmsg(sock, msg, len, flags);
118068983259SGustavo F. Padovan 
1181e328140fSMat Martineau 	if (pi->chan->mode != L2CAP_MODE_ERTM)
1182e328140fSMat Martineau 		return err;
1183e328140fSMat Martineau 
1184e328140fSMat Martineau 	/* Attempt to put pending rx data in the socket buffer */
1185e328140fSMat Martineau 
1186e328140fSMat Martineau 	lock_sock(sk);
1187e328140fSMat Martineau 
1188e328140fSMat Martineau 	if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
1189e328140fSMat Martineau 		goto done;
1190e328140fSMat Martineau 
1191e328140fSMat Martineau 	if (pi->rx_busy_skb) {
1192dbb50887SDaniel Borkmann 		if (!__sock_queue_rcv_skb(sk, pi->rx_busy_skb))
1193e328140fSMat Martineau 			pi->rx_busy_skb = NULL;
1194e328140fSMat Martineau 		else
1195e328140fSMat Martineau 			goto done;
1196e328140fSMat Martineau 	}
1197e328140fSMat Martineau 
1198e328140fSMat Martineau 	/* Restore data flow when half of the receive buffer is
1199e328140fSMat Martineau 	 * available.  This avoids resending large numbers of
1200e328140fSMat Martineau 	 * frames.
1201e328140fSMat Martineau 	 */
1202e328140fSMat Martineau 	if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
1203e328140fSMat Martineau 		l2cap_chan_busy(pi->chan, 0);
1204e328140fSMat Martineau 
1205e328140fSMat Martineau done:
1206e328140fSMat Martineau 	release_sock(sk);
1207e328140fSMat Martineau 	return err;
120868983259SGustavo F. Padovan }
120968983259SGustavo F. Padovan 
121005fc1576SGustavo F. Padovan /* Kill socket (only if zapped and orphan)
12116c08fc89SManish Mandlik  * Must be called on unlocked socket, with l2cap channel lock.
121205fc1576SGustavo F. Padovan  */
l2cap_sock_kill(struct sock * sk)1213ba3bd0eeSGustavo F. Padovan static void l2cap_sock_kill(struct sock *sk)
121405fc1576SGustavo F. Padovan {
121505fc1576SGustavo F. Padovan 	if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
121605fc1576SGustavo F. Padovan 		return;
121705fc1576SGustavo F. Padovan 
1218e05dcc32SAndrei Emeltchenko 	BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
121905fc1576SGustavo F. Padovan 
122005fc1576SGustavo F. Padovan 	/* Kill poor orphan */
12216ff5abbfSGustavo F. Padovan 
12224af66c69SJaganath Kanakkassery 	l2cap_chan_put(l2cap_pi(sk)->chan);
122305fc1576SGustavo F. Padovan 	sock_set_flag(sk, SOCK_DEAD);
122405fc1576SGustavo F. Padovan 	sock_put(sk);
122505fc1576SGustavo F. Padovan }
122605fc1576SGustavo F. Padovan 
__l2cap_wait_ack(struct sock * sk,struct l2cap_chan * chan)1227f65468f6SDean Jenkins static int __l2cap_wait_ack(struct sock *sk, struct l2cap_chan *chan)
1228dc25306bSGustavo Padovan {
1229dc25306bSGustavo Padovan 	DECLARE_WAITQUEUE(wait, current);
1230dc25306bSGustavo Padovan 	int err = 0;
1231cb02a255SDean Jenkins 	int timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
1232e432c72cSDean Jenkins 	/* Timeout to prevent infinite loop */
1233e432c72cSDean Jenkins 	unsigned long timeout = jiffies + L2CAP_WAIT_ACK_TIMEOUT;
1234dc25306bSGustavo Padovan 
1235dc25306bSGustavo Padovan 	add_wait_queue(sk_sleep(sk), &wait);
1236dc25306bSGustavo Padovan 	set_current_state(TASK_INTERRUPTIBLE);
1237f65468f6SDean Jenkins 	do {
1238e432c72cSDean Jenkins 		BT_DBG("Waiting for %d ACKs, timeout %04d ms",
1239e432c72cSDean Jenkins 		       chan->unacked_frames, time_after(jiffies, timeout) ? 0 :
1240e432c72cSDean Jenkins 		       jiffies_to_msecs(timeout - jiffies));
1241451e4c6cSDean Jenkins 
1242dc25306bSGustavo Padovan 		if (!timeo)
1243cb02a255SDean Jenkins 			timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
1244dc25306bSGustavo Padovan 
1245dc25306bSGustavo Padovan 		if (signal_pending(current)) {
1246dc25306bSGustavo Padovan 			err = sock_intr_errno(timeo);
1247dc25306bSGustavo Padovan 			break;
1248dc25306bSGustavo Padovan 		}
1249dc25306bSGustavo Padovan 
1250dc25306bSGustavo Padovan 		release_sock(sk);
1251dc25306bSGustavo Padovan 		timeo = schedule_timeout(timeo);
1252dc25306bSGustavo Padovan 		lock_sock(sk);
1253dc25306bSGustavo Padovan 		set_current_state(TASK_INTERRUPTIBLE);
1254dc25306bSGustavo Padovan 
1255dc25306bSGustavo Padovan 		err = sock_error(sk);
1256dc25306bSGustavo Padovan 		if (err)
1257dc25306bSGustavo Padovan 			break;
1258f65468f6SDean Jenkins 
1259e432c72cSDean Jenkins 		if (time_after(jiffies, timeout)) {
1260e432c72cSDean Jenkins 			err = -ENOLINK;
1261e432c72cSDean Jenkins 			break;
1262e432c72cSDean Jenkins 		}
1263e432c72cSDean Jenkins 
1264f65468f6SDean Jenkins 	} while (chan->unacked_frames > 0 &&
1265f65468f6SDean Jenkins 		 chan->state == BT_CONNECTED);
1266f65468f6SDean Jenkins 
1267dc25306bSGustavo Padovan 	set_current_state(TASK_RUNNING);
1268dc25306bSGustavo Padovan 	remove_wait_queue(sk_sleep(sk), &wait);
1269dc25306bSGustavo Padovan 	return err;
1270dc25306bSGustavo Padovan }
1271dc25306bSGustavo Padovan 
l2cap_sock_shutdown(struct socket * sock,int how)1272dcba0dbaSGustavo F. Padovan static int l2cap_sock_shutdown(struct socket *sock, int how)
1273dcba0dbaSGustavo F. Padovan {
1274dcba0dbaSGustavo F. Padovan 	struct sock *sk = sock->sk;
12757ddb6e0fSAndrei Emeltchenko 	struct l2cap_chan *chan;
12763df91ea2SAndrei Emeltchenko 	struct l2cap_conn *conn;
1277dcba0dbaSGustavo F. Padovan 	int err = 0;
1278dcba0dbaSGustavo F. Padovan 
12795b440676SArchie Pusaka 	BT_DBG("sock %p, sk %p, how %d", sock, sk, how);
12805b440676SArchie Pusaka 
12815b440676SArchie Pusaka 	/* 'how' parameter is mapped to sk_shutdown as follows:
12825b440676SArchie Pusaka 	 * SHUT_RD   (0) --> RCV_SHUTDOWN  (1)
12835b440676SArchie Pusaka 	 * SHUT_WR   (1) --> SEND_SHUTDOWN (2)
12845b440676SArchie Pusaka 	 * SHUT_RDWR (2) --> SHUTDOWN_MASK (3)
12855b440676SArchie Pusaka 	 */
12865b440676SArchie Pusaka 	how++;
1287dcba0dbaSGustavo F. Padovan 
1288dcba0dbaSGustavo F. Padovan 	if (!sk)
1289dcba0dbaSGustavo F. Padovan 		return 0;
1290dcba0dbaSGustavo F. Padovan 
129104ba72e6SDean Jenkins 	lock_sock(sk);
129204ba72e6SDean Jenkins 
12935b440676SArchie Pusaka 	if ((sk->sk_shutdown & how) == how)
1294e7456437SDean Jenkins 		goto shutdown_already;
1295e7456437SDean Jenkins 
1296e7456437SDean Jenkins 	BT_DBG("Handling sock shutdown");
1297e7456437SDean Jenkins 
12982baea85dSDean Jenkins 	/* prevent sk structure from being freed whilst unlocked */
12992baea85dSDean Jenkins 	sock_hold(sk);
13002baea85dSDean Jenkins 
13017ddb6e0fSAndrei Emeltchenko 	chan = l2cap_pi(sk)->chan;
13022baea85dSDean Jenkins 	/* prevent chan structure from being freed whilst unlocked */
13032baea85dSDean Jenkins 	l2cap_chan_hold(chan);
13043df91ea2SAndrei Emeltchenko 
130549d11741SJohan Hedberg 	BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
130649d11741SJohan Hedberg 
1307f65468f6SDean Jenkins 	if (chan->mode == L2CAP_MODE_ERTM &&
1308f65468f6SDean Jenkins 	    chan->unacked_frames > 0 &&
13099f7378a9SDean Jenkins 	    chan->state == BT_CONNECTED) {
1310f65468f6SDean Jenkins 		err = __l2cap_wait_ack(sk, chan);
1311dcba0dbaSGustavo F. Padovan 
13129f7378a9SDean Jenkins 		/* After waiting for ACKs, check whether shutdown
13139f7378a9SDean Jenkins 		 * has already been actioned to close the L2CAP
13149f7378a9SDean Jenkins 		 * link such as by l2cap_disconnection_req().
13159f7378a9SDean Jenkins 		 */
13165b440676SArchie Pusaka 		if ((sk->sk_shutdown & how) == how)
13175b440676SArchie Pusaka 			goto shutdown_matched;
13189f7378a9SDean Jenkins 	}
13199f7378a9SDean Jenkins 
13205b440676SArchie Pusaka 	/* Try setting the RCV_SHUTDOWN bit, return early if SEND_SHUTDOWN
13215b440676SArchie Pusaka 	 * is already set
13225b440676SArchie Pusaka 	 */
13235b440676SArchie Pusaka 	if ((how & RCV_SHUTDOWN) && !(sk->sk_shutdown & RCV_SHUTDOWN)) {
13245b440676SArchie Pusaka 		sk->sk_shutdown |= RCV_SHUTDOWN;
13255b440676SArchie Pusaka 		if ((sk->sk_shutdown & how) == how)
13265b440676SArchie Pusaka 			goto shutdown_matched;
13275b440676SArchie Pusaka 	}
13285b440676SArchie Pusaka 
13295b440676SArchie Pusaka 	sk->sk_shutdown |= SEND_SHUTDOWN;
13306be36555SAndrei Emeltchenko 	release_sock(sk);
133104ba72e6SDean Jenkins 
133204ba72e6SDean Jenkins 	l2cap_chan_lock(chan);
133304ba72e6SDean Jenkins 	conn = chan->conn;
133404ba72e6SDean Jenkins 	if (conn)
133504ba72e6SDean Jenkins 		/* prevent conn structure from being freed */
133604ba72e6SDean Jenkins 		l2cap_conn_get(conn);
133704ba72e6SDean Jenkins 	l2cap_chan_unlock(chan);
133804ba72e6SDean Jenkins 
133904ba72e6SDean Jenkins 	if (conn)
134004ba72e6SDean Jenkins 		/* mutex lock must be taken before l2cap_chan_lock() */
134104ba72e6SDean Jenkins 		mutex_lock(&conn->chan_lock);
134204ba72e6SDean Jenkins 
134304ba72e6SDean Jenkins 	l2cap_chan_lock(chan);
13440f852724SGustavo F. Padovan 	l2cap_chan_close(chan, 0);
134504ba72e6SDean Jenkins 	l2cap_chan_unlock(chan);
134604ba72e6SDean Jenkins 
134704ba72e6SDean Jenkins 	if (conn) {
134804ba72e6SDean Jenkins 		mutex_unlock(&conn->chan_lock);
134904ba72e6SDean Jenkins 		l2cap_conn_put(conn);
135004ba72e6SDean Jenkins 	}
135104ba72e6SDean Jenkins 
13526be36555SAndrei Emeltchenko 	lock_sock(sk);
1353dcba0dbaSGustavo F. Padovan 
1354093facf3SVladimir Davydov 	if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1355093facf3SVladimir Davydov 	    !(current->flags & PF_EXITING))
1356dcba0dbaSGustavo F. Padovan 		err = bt_sock_wait_state(sk, BT_CLOSED,
1357dcba0dbaSGustavo F. Padovan 					 sk->sk_lingertime);
1358dcba0dbaSGustavo F. Padovan 
13595b440676SArchie Pusaka shutdown_matched:
13602baea85dSDean Jenkins 	l2cap_chan_put(chan);
13612baea85dSDean Jenkins 	sock_put(sk);
13622baea85dSDean Jenkins 
1363e7456437SDean Jenkins shutdown_already:
136404ba72e6SDean Jenkins 	if (!err && sk->sk_err)
136504ba72e6SDean Jenkins 		err = -sk->sk_err;
136604ba72e6SDean Jenkins 
136704ba72e6SDean Jenkins 	release_sock(sk);
136804ba72e6SDean Jenkins 
136904ba72e6SDean Jenkins 	BT_DBG("Sock shutdown complete err: %d", err);
1370451e4c6cSDean Jenkins 
1371dcba0dbaSGustavo F. Padovan 	return err;
1372dcba0dbaSGustavo F. Padovan }
1373dcba0dbaSGustavo F. Padovan 
l2cap_sock_release(struct socket * sock)1374554f05bbSGustavo F. Padovan static int l2cap_sock_release(struct socket *sock)
1375554f05bbSGustavo F. Padovan {
1376554f05bbSGustavo F. Padovan 	struct sock *sk = sock->sk;
1377554f05bbSGustavo F. Padovan 	int err;
13782a154903SHillf Danton 	struct l2cap_chan *chan;
1379554f05bbSGustavo F. Padovan 
1380554f05bbSGustavo F. Padovan 	BT_DBG("sock %p, sk %p", sock, sk);
1381554f05bbSGustavo F. Padovan 
1382554f05bbSGustavo F. Padovan 	if (!sk)
1383554f05bbSGustavo F. Padovan 		return 0;
1384554f05bbSGustavo F. Padovan 
13851728137bSSungwoo Kim 	l2cap_sock_cleanup_listen(sk);
13865b28d95cSMasatake YAMATO 	bt_sock_unlink(&l2cap_sk_list, sk);
13875b28d95cSMasatake YAMATO 
13885b440676SArchie Pusaka 	err = l2cap_sock_shutdown(sock, SHUT_RDWR);
13892a154903SHillf Danton 	chan = l2cap_pi(sk)->chan;
1390554f05bbSGustavo F. Padovan 
13912a154903SHillf Danton 	l2cap_chan_hold(chan);
13922a154903SHillf Danton 	l2cap_chan_lock(chan);
13936c08fc89SManish Mandlik 
1394554f05bbSGustavo F. Padovan 	sock_orphan(sk);
1395554f05bbSGustavo F. Padovan 	l2cap_sock_kill(sk);
13966c08fc89SManish Mandlik 
13972a154903SHillf Danton 	l2cap_chan_unlock(chan);
13982a154903SHillf Danton 	l2cap_chan_put(chan);
13996c08fc89SManish Mandlik 
1400554f05bbSGustavo F. Padovan 	return err;
1401554f05bbSGustavo F. Padovan }
1402554f05bbSGustavo F. Padovan 
l2cap_sock_cleanup_listen(struct sock * parent)1403c0df7f6eSAndrei Emeltchenko static void l2cap_sock_cleanup_listen(struct sock *parent)
1404c0df7f6eSAndrei Emeltchenko {
1405c0df7f6eSAndrei Emeltchenko 	struct sock *sk;
1406c0df7f6eSAndrei Emeltchenko 
140749d11741SJohan Hedberg 	BT_DBG("parent %p state %s", parent,
140849d11741SJohan Hedberg 	       state_to_string(parent->sk_state));
1409c0df7f6eSAndrei Emeltchenko 
1410c0df7f6eSAndrei Emeltchenko 	/* Close not yet accepted channels */
1411c0df7f6eSAndrei Emeltchenko 	while ((sk = bt_accept_dequeue(parent, NULL))) {
1412c0df7f6eSAndrei Emeltchenko 		struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1413c0df7f6eSAndrei Emeltchenko 
141449d11741SJohan Hedberg 		BT_DBG("child chan %p state %s", chan,
141549d11741SJohan Hedberg 		       state_to_string(chan->state));
141649d11741SJohan Hedberg 
14176c08fc89SManish Mandlik 		l2cap_chan_hold(chan);
1418c0df7f6eSAndrei Emeltchenko 		l2cap_chan_lock(chan);
14196c08fc89SManish Mandlik 
1420c0df7f6eSAndrei Emeltchenko 		__clear_chan_timer(chan);
1421c0df7f6eSAndrei Emeltchenko 		l2cap_chan_close(chan, ECONNRESET);
1422c0df7f6eSAndrei Emeltchenko 		l2cap_sock_kill(sk);
14236c08fc89SManish Mandlik 
14246c08fc89SManish Mandlik 		l2cap_chan_unlock(chan);
14256c08fc89SManish Mandlik 		l2cap_chan_put(chan);
1426c0df7f6eSAndrei Emeltchenko 	}
1427c0df7f6eSAndrei Emeltchenko }
1428c0df7f6eSAndrei Emeltchenko 
l2cap_sock_new_connection_cb(struct l2cap_chan * chan)142980b98027SGustavo Padovan static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
143080808e43SGustavo F. Padovan {
143180b98027SGustavo Padovan 	struct sock *sk, *parent = chan->data;
143280808e43SGustavo F. Padovan 
14338ffb9290SGustavo Padovan 	lock_sock(parent);
14348ffb9290SGustavo Padovan 
143553826692SGustavo Padovan 	/* Check for backlog size */
143653826692SGustavo Padovan 	if (sk_acceptq_is_full(parent)) {
143753826692SGustavo Padovan 		BT_DBG("backlog full %d", parent->sk_ack_backlog);
14388a96f3cdSJukka Taimisto 		release_sock(parent);
143953826692SGustavo Padovan 		return NULL;
144053826692SGustavo Padovan 	}
144153826692SGustavo Padovan 
144280808e43SGustavo F. Padovan 	sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
144311aa9c28SEric W. Biederman 			      GFP_ATOMIC, 0);
14448a96f3cdSJukka Taimisto 	if (!sk) {
14458a96f3cdSJukka Taimisto 		release_sock(parent);
144680808e43SGustavo F. Padovan 		return NULL;
14478a96f3cdSJukka Taimisto         }
144880808e43SGustavo F. Padovan 
1449d22015aaSOctavian Purdila 	bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1450d22015aaSOctavian Purdila 
145180808e43SGustavo F. Padovan 	l2cap_sock_init(sk, parent);
145280808e43SGustavo F. Padovan 
1453c4f5627fSMatthias Kaehlcke 	bt_accept_enqueue(parent, sk, false);
1454644912e1SGustavo Padovan 
14558ffb9290SGustavo Padovan 	release_sock(parent);
14568ffb9290SGustavo Padovan 
145780808e43SGustavo F. Padovan 	return l2cap_pi(sk)->chan;
145880808e43SGustavo F. Padovan }
145980808e43SGustavo F. Padovan 
l2cap_sock_recv_cb(struct l2cap_chan * chan,struct sk_buff * skb)146080b98027SGustavo Padovan static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
146123070494SGustavo F. Padovan {
146280b98027SGustavo Padovan 	struct sock *sk = chan->data;
146384b34d98SMarcel Holtmann 	int err;
146423070494SGustavo F. Padovan 
14656be36555SAndrei Emeltchenko 	lock_sock(sk);
14666be36555SAndrei Emeltchenko 
146784b34d98SMarcel Holtmann 	if (l2cap_pi(sk)->rx_busy_skb) {
14686be36555SAndrei Emeltchenko 		err = -ENOMEM;
14696be36555SAndrei Emeltchenko 		goto done;
14706be36555SAndrei Emeltchenko 	}
1471e328140fSMat Martineau 
1472dbb50887SDaniel Borkmann 	if (chan->mode != L2CAP_MODE_ERTM &&
1473dbb50887SDaniel Borkmann 	    chan->mode != L2CAP_MODE_STREAMING) {
1474dbb50887SDaniel Borkmann 		/* Even if no filter is attached, we could potentially
1475dbb50887SDaniel Borkmann 		 * get errors from security modules, etc.
1476dbb50887SDaniel Borkmann 		 */
1477dbb50887SDaniel Borkmann 		err = sk_filter(sk, skb);
1478dbb50887SDaniel Borkmann 		if (err)
1479dbb50887SDaniel Borkmann 			goto done;
1480dbb50887SDaniel Borkmann 	}
1481dbb50887SDaniel Borkmann 
1482dbb50887SDaniel Borkmann 	err = __sock_queue_rcv_skb(sk, skb);
1483e328140fSMat Martineau 
1484e328140fSMat Martineau 	/* For ERTM, handle one skb that doesn't fit into the recv
1485e328140fSMat Martineau 	 * buffer.  This is important to do because the data frames
1486e328140fSMat Martineau 	 * have already been acked, so the skb cannot be discarded.
1487e328140fSMat Martineau 	 *
1488e328140fSMat Martineau 	 * Notify the l2cap core that the buffer is full, so the
1489e328140fSMat Martineau 	 * LOCAL_BUSY state is entered and no more frames are
1490e328140fSMat Martineau 	 * acked and reassembled until there is buffer space
1491e328140fSMat Martineau 	 * available.
1492e328140fSMat Martineau 	 */
149384b34d98SMarcel Holtmann 	if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
149484b34d98SMarcel Holtmann 		l2cap_pi(sk)->rx_busy_skb = skb;
149584b34d98SMarcel Holtmann 		l2cap_chan_busy(chan, 1);
1496e328140fSMat Martineau 		err = 0;
1497e328140fSMat Martineau 	}
1498e328140fSMat Martineau 
14996be36555SAndrei Emeltchenko done:
15006be36555SAndrei Emeltchenko 	release_sock(sk);
15016be36555SAndrei Emeltchenko 
1502e328140fSMat Martineau 	return err;
150323070494SGustavo F. Padovan }
150423070494SGustavo F. Padovan 
l2cap_sock_close_cb(struct l2cap_chan * chan)150580b98027SGustavo Padovan static void l2cap_sock_close_cb(struct l2cap_chan *chan)
1506ba3bd0eeSGustavo F. Padovan {
150780b98027SGustavo Padovan 	struct sock *sk = chan->data;
1508ba3bd0eeSGustavo F. Padovan 
15091bff51eaSWang ShaoBo 	if (!sk)
15101bff51eaSWang ShaoBo 		return;
15111bff51eaSWang ShaoBo 
1512ba3bd0eeSGustavo F. Padovan 	l2cap_sock_kill(sk);
1513ba3bd0eeSGustavo F. Padovan }
1514ba3bd0eeSGustavo F. Padovan 
l2cap_sock_teardown_cb(struct l2cap_chan * chan,int err)1515c0df7f6eSAndrei Emeltchenko static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1516c0df7f6eSAndrei Emeltchenko {
1517c0df7f6eSAndrei Emeltchenko 	struct sock *sk = chan->data;
1518c0df7f6eSAndrei Emeltchenko 	struct sock *parent;
1519c0df7f6eSAndrei Emeltchenko 
15201bff51eaSWang ShaoBo 	if (!sk)
15211bff51eaSWang ShaoBo 		return;
15221bff51eaSWang ShaoBo 
152349d11741SJohan Hedberg 	BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
152449d11741SJohan Hedberg 
15253b2ab39eSJohan Hedberg 	/* This callback can be called both for server (BT_LISTEN)
15263b2ab39eSJohan Hedberg 	 * sockets as well as "normal" ones. To avoid lockdep warnings
15273b2ab39eSJohan Hedberg 	 * with child socket locking (through l2cap_sock_cleanup_listen)
15283b2ab39eSJohan Hedberg 	 * we need separation into separate nesting levels. The simplest
15293b2ab39eSJohan Hedberg 	 * way to accomplish this is to inherit the nesting level used
15303b2ab39eSJohan Hedberg 	 * for the channel.
15313b2ab39eSJohan Hedberg 	 */
15323b2ab39eSJohan Hedberg 	lock_sock_nested(sk, atomic_read(&chan->nesting));
1533c0df7f6eSAndrei Emeltchenko 
1534c0df7f6eSAndrei Emeltchenko 	parent = bt_sk(sk)->parent;
1535c0df7f6eSAndrei Emeltchenko 
1536c0df7f6eSAndrei Emeltchenko 	switch (chan->state) {
1537c0df7f6eSAndrei Emeltchenko 	case BT_OPEN:
1538c0df7f6eSAndrei Emeltchenko 	case BT_BOUND:
1539c0df7f6eSAndrei Emeltchenko 	case BT_CLOSED:
1540c0df7f6eSAndrei Emeltchenko 		break;
1541c0df7f6eSAndrei Emeltchenko 	case BT_LISTEN:
1542c0df7f6eSAndrei Emeltchenko 		l2cap_sock_cleanup_listen(sk);
1543c0df7f6eSAndrei Emeltchenko 		sk->sk_state = BT_CLOSED;
1544c0df7f6eSAndrei Emeltchenko 		chan->state = BT_CLOSED;
1545c0df7f6eSAndrei Emeltchenko 
1546c0df7f6eSAndrei Emeltchenko 		break;
1547c0df7f6eSAndrei Emeltchenko 	default:
1548c0df7f6eSAndrei Emeltchenko 		sk->sk_state = BT_CLOSED;
1549c0df7f6eSAndrei Emeltchenko 		chan->state = BT_CLOSED;
1550c0df7f6eSAndrei Emeltchenko 
1551c0df7f6eSAndrei Emeltchenko 		sk->sk_err = err;
1552c0df7f6eSAndrei Emeltchenko 
1553c0df7f6eSAndrei Emeltchenko 		if (parent) {
1554c0df7f6eSAndrei Emeltchenko 			bt_accept_unlink(sk);
1555676d2369SDavid S. Miller 			parent->sk_data_ready(parent);
1556c0df7f6eSAndrei Emeltchenko 		} else {
1557c0df7f6eSAndrei Emeltchenko 			sk->sk_state_change(sk);
1558c0df7f6eSAndrei Emeltchenko 		}
1559c0df7f6eSAndrei Emeltchenko 
1560c0df7f6eSAndrei Emeltchenko 		break;
1561c0df7f6eSAndrei Emeltchenko 	}
1562c0df7f6eSAndrei Emeltchenko 	release_sock(sk);
156320ae4089SAbhishek Pandit-Subedi 
156420ae4089SAbhishek Pandit-Subedi 	/* Only zap after cleanup to avoid use after free race */
156520ae4089SAbhishek Pandit-Subedi 	sock_set_flag(sk, SOCK_ZAPPED);
156620ae4089SAbhishek Pandit-Subedi 
1567c0df7f6eSAndrei Emeltchenko }
1568c0df7f6eSAndrei Emeltchenko 
l2cap_sock_state_change_cb(struct l2cap_chan * chan,int state,int err)156953f52121SGustavo Padovan static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
157053f52121SGustavo Padovan 				       int err)
157189bc500eSGustavo F. Padovan {
157280b98027SGustavo Padovan 	struct sock *sk = chan->data;
157389bc500eSGustavo F. Padovan 
157489bc500eSGustavo F. Padovan 	sk->sk_state = state;
157553f52121SGustavo Padovan 
157653f52121SGustavo Padovan 	if (err)
157753f52121SGustavo Padovan 		sk->sk_err = err;
157889bc500eSGustavo F. Padovan }
157989bc500eSGustavo F. Padovan 
l2cap_sock_alloc_skb_cb(struct l2cap_chan * chan,unsigned long hdr_len,unsigned long len,int nb)15802f7719ceSAndrei Emeltchenko static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
1581d9fbd02bSMarcel Holtmann 					       unsigned long hdr_len,
158290338947SGustavo Padovan 					       unsigned long len, int nb)
15832f7719ceSAndrei Emeltchenko {
15840f2c6153SGustavo Padovan 	struct sock *sk = chan->data;
158590338947SGustavo Padovan 	struct sk_buff *skb;
158690338947SGustavo Padovan 	int err;
15872f7719ceSAndrei Emeltchenko 
1588a6a5568cSMat Martineau 	l2cap_chan_unlock(chan);
1589d9fbd02bSMarcel Holtmann 	skb = bt_skb_send_alloc(sk, hdr_len + len, nb, &err);
1590a6a5568cSMat Martineau 	l2cap_chan_lock(chan);
1591a6a5568cSMat Martineau 
159290338947SGustavo Padovan 	if (!skb)
159390338947SGustavo Padovan 		return ERR_PTR(err);
159490338947SGustavo Padovan 
1595df570334SLuiz Augusto von Dentz 	/* Channel lock is released before requesting new skb and then
1596df570334SLuiz Augusto von Dentz 	 * reacquired thus we need to recheck channel state.
1597df570334SLuiz Augusto von Dentz 	 */
1598df570334SLuiz Augusto von Dentz 	if (chan->state != BT_CONNECTED) {
1599df570334SLuiz Augusto von Dentz 		kfree_skb(skb);
1600df570334SLuiz Augusto von Dentz 		return ERR_PTR(-ENOTCONN);
1601df570334SLuiz Augusto von Dentz 	}
1602df570334SLuiz Augusto von Dentz 
16038d46321cSMarcel Holtmann 	skb->priority = sk->sk_priority;
16048d46321cSMarcel Holtmann 
1605a4368ff3SJohan Hedberg 	bt_cb(skb)->l2cap.chan = chan;
16060e790c64SGustavo Padovan 
160790338947SGustavo Padovan 	return skb;
16082f7719ceSAndrei Emeltchenko }
16092f7719ceSAndrei Emeltchenko 
l2cap_sock_ready_cb(struct l2cap_chan * chan)161054a59aa2SAndrei Emeltchenko static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
161154a59aa2SAndrei Emeltchenko {
161254a59aa2SAndrei Emeltchenko 	struct sock *sk = chan->data;
161354a59aa2SAndrei Emeltchenko 	struct sock *parent;
161454a59aa2SAndrei Emeltchenko 
161554a59aa2SAndrei Emeltchenko 	lock_sock(sk);
161654a59aa2SAndrei Emeltchenko 
161754a59aa2SAndrei Emeltchenko 	parent = bt_sk(sk)->parent;
161854a59aa2SAndrei Emeltchenko 
161954a59aa2SAndrei Emeltchenko 	BT_DBG("sk %p, parent %p", sk, parent);
162054a59aa2SAndrei Emeltchenko 
162154a59aa2SAndrei Emeltchenko 	sk->sk_state = BT_CONNECTED;
162254a59aa2SAndrei Emeltchenko 	sk->sk_state_change(sk);
162354a59aa2SAndrei Emeltchenko 
162454a59aa2SAndrei Emeltchenko 	if (parent)
1625676d2369SDavid S. Miller 		parent->sk_data_ready(parent);
162654a59aa2SAndrei Emeltchenko 
162754a59aa2SAndrei Emeltchenko 	release_sock(sk);
162854a59aa2SAndrei Emeltchenko }
162954a59aa2SAndrei Emeltchenko 
l2cap_sock_defer_cb(struct l2cap_chan * chan)16302dc4e510SGustavo Padovan static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
16312dc4e510SGustavo Padovan {
1632acdcabf5SGustavo Padovan 	struct sock *parent, *sk = chan->data;
16332dc4e510SGustavo Padovan 
1634acdcabf5SGustavo Padovan 	lock_sock(sk);
1635acdcabf5SGustavo Padovan 
1636acdcabf5SGustavo Padovan 	parent = bt_sk(sk)->parent;
16372dc4e510SGustavo Padovan 	if (parent)
1638676d2369SDavid S. Miller 		parent->sk_data_ready(parent);
1639acdcabf5SGustavo Padovan 
1640acdcabf5SGustavo Padovan 	release_sock(sk);
16412dc4e510SGustavo Padovan }
16422dc4e510SGustavo Padovan 
l2cap_sock_resume_cb(struct l2cap_chan * chan)1643d97c899bSMarcel Holtmann static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1644d97c899bSMarcel Holtmann {
1645d97c899bSMarcel Holtmann 	struct sock *sk = chan->data;
1646d97c899bSMarcel Holtmann 
1647d52deb17SJohan Hedberg 	if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) {
1648d52deb17SJohan Hedberg 		sk->sk_state = BT_CONNECTED;
1649d52deb17SJohan Hedberg 		chan->state = BT_CONNECTED;
1650d52deb17SJohan Hedberg 	}
1651d52deb17SJohan Hedberg 
1652d97c899bSMarcel Holtmann 	clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1653d97c899bSMarcel Holtmann 	sk->sk_state_change(sk);
1654d97c899bSMarcel Holtmann }
1655d97c899bSMarcel Holtmann 
l2cap_sock_set_shutdown_cb(struct l2cap_chan * chan)16565ec1bbe5SGustavo Padovan static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
16575ec1bbe5SGustavo Padovan {
16585ec1bbe5SGustavo Padovan 	struct sock *sk = chan->data;
16595ec1bbe5SGustavo Padovan 
16605ec1bbe5SGustavo Padovan 	lock_sock(sk);
16615ec1bbe5SGustavo Padovan 	sk->sk_shutdown = SHUTDOWN_MASK;
16625ec1bbe5SGustavo Padovan 	release_sock(sk);
16635ec1bbe5SGustavo Padovan }
16645ec1bbe5SGustavo Padovan 
l2cap_sock_get_sndtimeo_cb(struct l2cap_chan * chan)16658d836d71SGustavo Padovan static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
16668d836d71SGustavo Padovan {
16678d836d71SGustavo Padovan 	struct sock *sk = chan->data;
16688d836d71SGustavo Padovan 
16698d836d71SGustavo Padovan 	return sk->sk_sndtimeo;
16708d836d71SGustavo Padovan }
16718d836d71SGustavo Padovan 
l2cap_sock_get_peer_pid_cb(struct l2cap_chan * chan)1672b48596d1SLuiz Augusto von Dentz static struct pid *l2cap_sock_get_peer_pid_cb(struct l2cap_chan *chan)
1673b48596d1SLuiz Augusto von Dentz {
1674b48596d1SLuiz Augusto von Dentz 	struct sock *sk = chan->data;
1675b48596d1SLuiz Augusto von Dentz 
1676b48596d1SLuiz Augusto von Dentz 	return sk->sk_peer_pid;
1677b48596d1SLuiz Augusto von Dentz }
1678b48596d1SLuiz Augusto von Dentz 
l2cap_sock_suspend_cb(struct l2cap_chan * chan)1679837776f7SJohan Hedberg static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1680837776f7SJohan Hedberg {
1681837776f7SJohan Hedberg 	struct sock *sk = chan->data;
1682837776f7SJohan Hedberg 
1683837776f7SJohan Hedberg 	set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1684837776f7SJohan Hedberg 	sk->sk_state_change(sk);
1685837776f7SJohan Hedberg }
1686837776f7SJohan Hedberg 
l2cap_sock_filter(struct l2cap_chan * chan,struct sk_buff * skb)1687f1942564SLuiz Augusto von Dentz static int l2cap_sock_filter(struct l2cap_chan *chan, struct sk_buff *skb)
1688f1942564SLuiz Augusto von Dentz {
1689f1942564SLuiz Augusto von Dentz 	struct sock *sk = chan->data;
1690f1942564SLuiz Augusto von Dentz 
1691f1942564SLuiz Augusto von Dentz 	switch (chan->mode) {
1692f1942564SLuiz Augusto von Dentz 	case L2CAP_MODE_ERTM:
1693f1942564SLuiz Augusto von Dentz 	case L2CAP_MODE_STREAMING:
1694f1942564SLuiz Augusto von Dentz 		return sk_filter(sk, skb);
1695f1942564SLuiz Augusto von Dentz 	}
1696f1942564SLuiz Augusto von Dentz 
1697f1942564SLuiz Augusto von Dentz 	return 0;
1698f1942564SLuiz Augusto von Dentz }
1699f1942564SLuiz Augusto von Dentz 
170067f86a45SMarcel Holtmann static const struct l2cap_ops l2cap_chan_ops = {
170180808e43SGustavo F. Padovan 	.name			= "L2CAP Socket Interface",
170280808e43SGustavo F. Padovan 	.new_connection		= l2cap_sock_new_connection_cb,
170323070494SGustavo F. Padovan 	.recv			= l2cap_sock_recv_cb,
1704ba3bd0eeSGustavo F. Padovan 	.close			= l2cap_sock_close_cb,
1705c0df7f6eSAndrei Emeltchenko 	.teardown		= l2cap_sock_teardown_cb,
170689bc500eSGustavo F. Padovan 	.state_change		= l2cap_sock_state_change_cb,
170754a59aa2SAndrei Emeltchenko 	.ready			= l2cap_sock_ready_cb,
17082dc4e510SGustavo Padovan 	.defer			= l2cap_sock_defer_cb,
1709d97c899bSMarcel Holtmann 	.resume			= l2cap_sock_resume_cb,
1710837776f7SJohan Hedberg 	.suspend		= l2cap_sock_suspend_cb,
17115ec1bbe5SGustavo Padovan 	.set_shutdown		= l2cap_sock_set_shutdown_cb,
17128d836d71SGustavo Padovan 	.get_sndtimeo		= l2cap_sock_get_sndtimeo_cb,
1713b48596d1SLuiz Augusto von Dentz 	.get_peer_pid		= l2cap_sock_get_peer_pid_cb,
17142f7719ceSAndrei Emeltchenko 	.alloc_skb		= l2cap_sock_alloc_skb_cb,
1715f1942564SLuiz Augusto von Dentz 	.filter			= l2cap_sock_filter,
171680808e43SGustavo F. Padovan };
171780808e43SGustavo F. Padovan 
l2cap_sock_destruct(struct sock * sk)1718bb58f747SGustavo F. Padovan static void l2cap_sock_destruct(struct sock *sk)
1719bb58f747SGustavo F. Padovan {
1720bb58f747SGustavo F. Padovan 	BT_DBG("sk %p", sk);
1721bb58f747SGustavo F. Padovan 
17221bff51eaSWang ShaoBo 	if (l2cap_pi(sk)->chan) {
17231bff51eaSWang ShaoBo 		l2cap_pi(sk)->chan->data = NULL;
172461d6ef3eSMat Martineau 		l2cap_chan_put(l2cap_pi(sk)->chan);
17251bff51eaSWang ShaoBo 	}
172684b34d98SMarcel Holtmann 
1727e328140fSMat Martineau 	if (l2cap_pi(sk)->rx_busy_skb) {
1728e328140fSMat Martineau 		kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1729e328140fSMat Martineau 		l2cap_pi(sk)->rx_busy_skb = NULL;
1730e328140fSMat Martineau 	}
1731e328140fSMat Martineau 
1732bb58f747SGustavo F. Padovan 	skb_queue_purge(&sk->sk_receive_queue);
1733bb58f747SGustavo F. Padovan 	skb_queue_purge(&sk->sk_write_queue);
1734bb58f747SGustavo F. Padovan }
1735bb58f747SGustavo F. Padovan 
l2cap_skb_msg_name(struct sk_buff * skb,void * msg_name,int * msg_namelen)17362edf870dSMarcel Holtmann static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
17372edf870dSMarcel Holtmann 			       int *msg_namelen)
17382edf870dSMarcel Holtmann {
1739342dfc30SSteffen Hurrle 	DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
17402edf870dSMarcel Holtmann 
17412edf870dSMarcel Holtmann 	memset(la, 0, sizeof(struct sockaddr_l2));
17422edf870dSMarcel Holtmann 	la->l2_family = AF_BLUETOOTH;
1743a4368ff3SJohan Hedberg 	la->l2_psm = bt_cb(skb)->l2cap.psm;
1744a4368ff3SJohan Hedberg 	bacpy(&la->l2_bdaddr, &bt_cb(skb)->l2cap.bdaddr);
17452edf870dSMarcel Holtmann 
17462edf870dSMarcel Holtmann 	*msg_namelen = sizeof(struct sockaddr_l2);
17472edf870dSMarcel Holtmann }
17482edf870dSMarcel Holtmann 
l2cap_sock_init(struct sock * sk,struct sock * parent)174980808e43SGustavo F. Padovan static void l2cap_sock_init(struct sock *sk, struct sock *parent)
1750bb58f747SGustavo F. Padovan {
175184b34d98SMarcel Holtmann 	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1752bb58f747SGustavo F. Padovan 
1753bb58f747SGustavo F. Padovan 	BT_DBG("sk %p", sk);
1754bb58f747SGustavo F. Padovan 
1755bb58f747SGustavo F. Padovan 	if (parent) {
1756b4450035SGustavo F. Padovan 		struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1757b4450035SGustavo F. Padovan 
1758bb58f747SGustavo F. Padovan 		sk->sk_type = parent->sk_type;
1759c5daa683SGustavo Padovan 		bt_sk(sk)->flags = bt_sk(parent)->flags;
1760bb58f747SGustavo F. Padovan 
1761715ec005SGustavo F. Padovan 		chan->chan_type = pchan->chan_type;
17620c1bc5c6SGustavo F. Padovan 		chan->imtu = pchan->imtu;
17630c1bc5c6SGustavo F. Padovan 		chan->omtu = pchan->omtu;
1764b4450035SGustavo F. Padovan 		chan->conf_state = pchan->conf_state;
17650c1bc5c6SGustavo F. Padovan 		chan->mode = pchan->mode;
176647d1ec61SGustavo F. Padovan 		chan->fcs  = pchan->fcs;
176747d1ec61SGustavo F. Padovan 		chan->max_tx = pchan->max_tx;
176847d1ec61SGustavo F. Padovan 		chan->tx_win = pchan->tx_win;
17696b3c7104SAndrei Emeltchenko 		chan->tx_win_max = pchan->tx_win_max;
17704343478fSGustavo F. Padovan 		chan->sec_level = pchan->sec_level;
1771d57b0e8bSAndrei Emeltchenko 		chan->flags = pchan->flags;
17720cd75f7eSJohan Hedberg 		chan->tx_credits = pchan->tx_credits;
17730cd75f7eSJohan Hedberg 		chan->rx_credits = pchan->rx_credits;
17746230c9b4SPaul Moore 
17757a8e5a31SJohan Hedberg 		if (chan->chan_type == L2CAP_CHAN_FIXED) {
17767a8e5a31SJohan Hedberg 			chan->scid = pchan->scid;
17777a8e5a31SJohan Hedberg 			chan->dcid = pchan->scid;
17787a8e5a31SJohan Hedberg 		}
17797a8e5a31SJohan Hedberg 
17806230c9b4SPaul Moore 		security_sk_clone(parent, sk);
1781bb58f747SGustavo F. Padovan 	} else {
1782715ec005SGustavo F. Padovan 		switch (sk->sk_type) {
1783715ec005SGustavo F. Padovan 		case SOCK_RAW:
1784715ec005SGustavo F. Padovan 			chan->chan_type = L2CAP_CHAN_RAW;
1785715ec005SGustavo F. Padovan 			break;
1786715ec005SGustavo F. Padovan 		case SOCK_DGRAM:
1787715ec005SGustavo F. Padovan 			chan->chan_type = L2CAP_CHAN_CONN_LESS;
17882edf870dSMarcel Holtmann 			bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
1789715ec005SGustavo F. Padovan 			break;
1790715ec005SGustavo F. Padovan 		case SOCK_SEQPACKET:
1791715ec005SGustavo F. Padovan 		case SOCK_STREAM:
1792715ec005SGustavo F. Padovan 			chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1793715ec005SGustavo F. Padovan 			break;
1794715ec005SGustavo F. Padovan 		}
1795715ec005SGustavo F. Padovan 
17960c1bc5c6SGustavo F. Padovan 		chan->imtu = L2CAP_DEFAULT_MTU;
17970c1bc5c6SGustavo F. Padovan 		chan->omtu = 0;
1798bb58f747SGustavo F. Padovan 		if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
17990c1bc5c6SGustavo F. Padovan 			chan->mode = L2CAP_MODE_ERTM;
1800c1360a1cSGustavo F. Padovan 			set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
1801bb58f747SGustavo F. Padovan 		} else {
18020c1bc5c6SGustavo F. Padovan 			chan->mode = L2CAP_MODE_BASIC;
1803bb58f747SGustavo F. Padovan 		}
1804bd4b1653SAndrei Emeltchenko 
1805bd4b1653SAndrei Emeltchenko 		l2cap_chan_set_defaults(chan);
1806bb58f747SGustavo F. Padovan 	}
1807bb58f747SGustavo F. Padovan 
1808bb58f747SGustavo F. Padovan 	/* Default config options */
18090c1bc5c6SGustavo F. Padovan 	chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
181080808e43SGustavo F. Padovan 
181180808e43SGustavo F. Padovan 	chan->data = sk;
181280808e43SGustavo F. Padovan 	chan->ops = &l2cap_chan_ops;
1813bb58f747SGustavo F. Padovan }
1814bb58f747SGustavo F. Padovan 
1815bb58f747SGustavo F. Padovan static struct proto l2cap_proto = {
1816bb58f747SGustavo F. Padovan 	.name		= "L2CAP",
1817bb58f747SGustavo F. Padovan 	.owner		= THIS_MODULE,
1818bb58f747SGustavo F. Padovan 	.obj_size	= sizeof(struct l2cap_pinfo)
1819bb58f747SGustavo F. Padovan };
1820bb58f747SGustavo F. Padovan 
l2cap_sock_alloc(struct net * net,struct socket * sock,int proto,gfp_t prio,int kern)18212d792818SGustavo Padovan static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
182211aa9c28SEric W. Biederman 				     int proto, gfp_t prio, int kern)
1823bb58f747SGustavo F. Padovan {
1824bb58f747SGustavo F. Padovan 	struct sock *sk;
1825dc50a06dSGustavo F. Padovan 	struct l2cap_chan *chan;
1826bb58f747SGustavo F. Padovan 
18276bfa273eSLuiz Augusto von Dentz 	sk = bt_sock_alloc(net, sock, &l2cap_proto, proto, prio, kern);
1828bb58f747SGustavo F. Padovan 	if (!sk)
1829bb58f747SGustavo F. Padovan 		return NULL;
1830bb58f747SGustavo F. Padovan 
1831bb58f747SGustavo F. Padovan 	sk->sk_destruct = l2cap_sock_destruct;
1832ba13ccd9SMarcel Holtmann 	sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
1833bb58f747SGustavo F. Padovan 
1834eef1d9b6SGustavo Padovan 	chan = l2cap_chan_create();
1835dc50a06dSGustavo F. Padovan 	if (!chan) {
183649dfbb91SJaganath Kanakkassery 		sk_free(sk);
1837dc50a06dSGustavo F. Padovan 		return NULL;
1838dc50a06dSGustavo F. Padovan 	}
1839dc50a06dSGustavo F. Padovan 
184061d6ef3eSMat Martineau 	l2cap_chan_hold(chan);
184161d6ef3eSMat Martineau 
1842dc50a06dSGustavo F. Padovan 	l2cap_pi(sk)->chan = chan;
1843dc50a06dSGustavo F. Padovan 
1844bb58f747SGustavo F. Padovan 	return sk;
1845bb58f747SGustavo F. Padovan }
1846bb58f747SGustavo F. Padovan 
l2cap_sock_create(struct net * net,struct socket * sock,int protocol,int kern)1847bb58f747SGustavo F. Padovan static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1848bb58f747SGustavo F. Padovan 			     int kern)
1849bb58f747SGustavo F. Padovan {
1850bb58f747SGustavo F. Padovan 	struct sock *sk;
1851bb58f747SGustavo F. Padovan 
1852bb58f747SGustavo F. Padovan 	BT_DBG("sock %p", sock);
1853bb58f747SGustavo F. Padovan 
1854bb58f747SGustavo F. Padovan 	sock->state = SS_UNCONNECTED;
1855bb58f747SGustavo F. Padovan 
1856bb58f747SGustavo F. Padovan 	if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
1857bb58f747SGustavo F. Padovan 	    sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
1858bb58f747SGustavo F. Padovan 		return -ESOCKTNOSUPPORT;
1859bb58f747SGustavo F. Padovan 
1860bb58f747SGustavo F. Padovan 	if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1861bb58f747SGustavo F. Padovan 		return -EPERM;
1862bb58f747SGustavo F. Padovan 
1863bb58f747SGustavo F. Padovan 	sock->ops = &l2cap_sock_ops;
1864bb58f747SGustavo F. Padovan 
186511aa9c28SEric W. Biederman 	sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
1866bb58f747SGustavo F. Padovan 	if (!sk)
1867bb58f747SGustavo F. Padovan 		return -ENOMEM;
1868bb58f747SGustavo F. Padovan 
1869bb58f747SGustavo F. Padovan 	l2cap_sock_init(sk, NULL);
18705b28d95cSMasatake YAMATO 	bt_sock_link(&l2cap_sk_list, sk);
1871bb58f747SGustavo F. Padovan 	return 0;
1872bb58f747SGustavo F. Padovan }
1873bb58f747SGustavo F. Padovan 
1874cf2f90f5SGustavo F. Padovan static const struct proto_ops l2cap_sock_ops = {
187565390587SGustavo F. Padovan 	.family		= PF_BLUETOOTH,
187665390587SGustavo F. Padovan 	.owner		= THIS_MODULE,
187765390587SGustavo F. Padovan 	.release	= l2cap_sock_release,
187865390587SGustavo F. Padovan 	.bind		= l2cap_sock_bind,
187965390587SGustavo F. Padovan 	.connect	= l2cap_sock_connect,
188065390587SGustavo F. Padovan 	.listen		= l2cap_sock_listen,
188165390587SGustavo F. Padovan 	.accept		= l2cap_sock_accept,
188265390587SGustavo F. Padovan 	.getname	= l2cap_sock_getname,
188365390587SGustavo F. Padovan 	.sendmsg	= l2cap_sock_sendmsg,
188465390587SGustavo F. Padovan 	.recvmsg	= l2cap_sock_recvmsg,
1885a11e1d43SLinus Torvalds 	.poll		= bt_sock_poll,
188665390587SGustavo F. Padovan 	.ioctl		= bt_sock_ioctl,
1887c7cbdbf2SArnd Bergmann 	.gettstamp	= sock_gettstamp,
188865390587SGustavo F. Padovan 	.mmap		= sock_no_mmap,
188965390587SGustavo F. Padovan 	.socketpair	= sock_no_socketpair,
189065390587SGustavo F. Padovan 	.shutdown	= l2cap_sock_shutdown,
189165390587SGustavo F. Padovan 	.setsockopt	= l2cap_sock_setsockopt,
189265390587SGustavo F. Padovan 	.getsockopt	= l2cap_sock_getsockopt
189365390587SGustavo F. Padovan };
189465390587SGustavo F. Padovan 
1895bb58f747SGustavo F. Padovan static const struct net_proto_family l2cap_sock_family_ops = {
1896bb58f747SGustavo F. Padovan 	.family	= PF_BLUETOOTH,
1897bb58f747SGustavo F. Padovan 	.owner	= THIS_MODULE,
1898bb58f747SGustavo F. Padovan 	.create	= l2cap_sock_create,
1899bb58f747SGustavo F. Padovan };
1900bb58f747SGustavo F. Padovan 
l2cap_init_sockets(void)1901bb58f747SGustavo F. Padovan int __init l2cap_init_sockets(void)
1902bb58f747SGustavo F. Padovan {
1903bb58f747SGustavo F. Padovan 	int err;
1904bb58f747SGustavo F. Padovan 
1905dd625558SMarcel Holtmann 	BUILD_BUG_ON(sizeof(struct sockaddr_l2) > sizeof(struct sockaddr));
1906dd625558SMarcel Holtmann 
1907bb58f747SGustavo F. Padovan 	err = proto_register(&l2cap_proto, 0);
1908bb58f747SGustavo F. Padovan 	if (err < 0)
1909bb58f747SGustavo F. Padovan 		return err;
1910bb58f747SGustavo F. Padovan 
1911bb58f747SGustavo F. Padovan 	err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
19125b28d95cSMasatake YAMATO 	if (err < 0) {
19135b28d95cSMasatake YAMATO 		BT_ERR("L2CAP socket registration failed");
1914bb58f747SGustavo F. Padovan 		goto error;
19155b28d95cSMasatake YAMATO 	}
19165b28d95cSMasatake YAMATO 
1917b0316615SAl Viro 	err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
19182d792818SGustavo Padovan 			     NULL);
19195b28d95cSMasatake YAMATO 	if (err < 0) {
19205b28d95cSMasatake YAMATO 		BT_ERR("Failed to create L2CAP proc file");
19215b28d95cSMasatake YAMATO 		bt_sock_unregister(BTPROTO_L2CAP);
19225b28d95cSMasatake YAMATO 		goto error;
19235b28d95cSMasatake YAMATO 	}
1924bb58f747SGustavo F. Padovan 
1925bb58f747SGustavo F. Padovan 	BT_INFO("L2CAP socket layer initialized");
1926bb58f747SGustavo F. Padovan 
1927bb58f747SGustavo F. Padovan 	return 0;
1928bb58f747SGustavo F. Padovan 
1929bb58f747SGustavo F. Padovan error:
1930bb58f747SGustavo F. Padovan 	proto_unregister(&l2cap_proto);
1931bb58f747SGustavo F. Padovan 	return err;
1932bb58f747SGustavo F. Padovan }
1933bb58f747SGustavo F. Padovan 
l2cap_cleanup_sockets(void)1934bb58f747SGustavo F. Padovan void l2cap_cleanup_sockets(void)
1935bb58f747SGustavo F. Padovan {
19365b28d95cSMasatake YAMATO 	bt_procfs_cleanup(&init_net, "l2cap");
19375e9d7f86SDavid Herrmann 	bt_sock_unregister(BTPROTO_L2CAP);
1938bb58f747SGustavo F. Padovan 	proto_unregister(&l2cap_proto);
1939bb58f747SGustavo F. Padovan }
1940