^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) BlueZ - Bluetooth protocol stack for Linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) Copyright (C) 2000-2001 Qualcomm Incorporated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) Copyright (C) 2010 Google Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) Copyright (C) 2011 ProFUSION Embedded Systems
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) it under the terms of the GNU General Public License version 2 as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) published by the Free Software Foundation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) SOFTWARE IS DISCLAIMED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) /* Bluetooth L2CAP sockets. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/sched/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <net/bluetooth/bluetooth.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <net/bluetooth/hci_core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <net/bluetooth/l2cap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include "smp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) static struct bt_sock_list l2cap_sk_list = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) static const struct proto_ops l2cap_sock_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) static void l2cap_sock_init(struct sock *sk, struct sock *parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) int proto, gfp_t prio, int kern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) bool l2cap_is_socket(struct socket *sock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) return sock && sock->ops == &l2cap_sock_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) EXPORT_SYMBOL(l2cap_is_socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static int l2cap_validate_bredr_psm(u16 psm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /* PSM must be odd and lsb of upper byte must be 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) if ((psm & 0x0101) != 0x0001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /* Restrict usage of well-known PSMs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) if (psm < L2CAP_PSM_DYN_START && !capable(CAP_NET_BIND_SERVICE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) return -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) static int l2cap_validate_le_psm(u16 psm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) /* Valid LE_PSM ranges are defined only until 0x00ff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) if (psm > L2CAP_PSM_LE_DYN_END)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) /* Restrict fixed, SIG assigned PSM values to CAP_NET_BIND_SERVICE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) if (psm < L2CAP_PSM_LE_DYN_START && !capable(CAP_NET_BIND_SERVICE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) return -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) struct sockaddr_l2 la;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) int len, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) addr->sa_family != AF_BLUETOOTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) memset(&la, 0, sizeof(la));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) len = min_t(unsigned int, sizeof(la), alen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) memcpy(&la, addr, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) if (la.l2_cid && la.l2_psm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* We only allow ATT user space socket */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) if (la.l2_cid &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) if (sk->sk_state != BT_OPEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) err = -EBADFD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if (la.l2_psm) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) __u16 psm = __le16_to_cpu(la.l2_psm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) if (la.l2_bdaddr_type == BDADDR_BREDR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) err = l2cap_validate_bredr_psm(psm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) err = l2cap_validate_le_psm(psm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) bacpy(&chan->src, &la.l2_bdaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) chan->src_type = la.l2_bdaddr_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) if (la.l2_cid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) switch (chan->chan_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) case L2CAP_CHAN_CONN_LESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_3DSP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) chan->sec_level = BT_SECURITY_SDP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) case L2CAP_CHAN_CONN_ORIENTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) chan->sec_level = BT_SECURITY_SDP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) case L2CAP_CHAN_RAW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) chan->sec_level = BT_SECURITY_SDP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) case L2CAP_CHAN_FIXED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) /* Fixed channels default to the L2CAP core not holding a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * hci_conn reference for them. For fixed channels mapping to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * L2CAP sockets we do want to hold a reference so set the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) * appropriate flag to request it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) set_bit(FLAG_HOLD_HCI_CONN, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) /* Use L2CAP_MODE_LE_FLOWCTL (CoC) in case of LE address and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * L2CAP_MODE_EXT_FLOWCTL (ECRED) has not been set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) if (chan->psm && bdaddr_type_is_le(chan->src_type) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) chan->mode != L2CAP_MODE_EXT_FLOWCTL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) chan->mode = L2CAP_MODE_LE_FLOWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) chan->state = BT_BOUND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) sk->sk_state = BT_BOUND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) static void l2cap_sock_init_pid(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) /* Only L2CAP_MODE_EXT_FLOWCTL ever need to access the PID in order to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) * group the channels being requested.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) if (chan->mode != L2CAP_MODE_EXT_FLOWCTL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) spin_lock(&sk->sk_peer_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) sk->sk_peer_pid = get_pid(task_tgid(current));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) spin_unlock(&sk->sk_peer_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) int alen, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) struct sockaddr_l2 la;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) int len, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) bool zapped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) zapped = sock_flag(sk, SOCK_ZAPPED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) if (zapped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) addr->sa_family != AF_BLUETOOTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) memset(&la, 0, sizeof(la));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) len = min_t(unsigned int, sizeof(la), alen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) memcpy(&la, addr, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) if (la.l2_cid && la.l2_psm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) /* Check that the socket wasn't bound to something that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * conflicts with the address given to connect(). If chan->src
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) * is BDADDR_ANY it means bind() was never used, in which case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) * chan->src_type and la.l2_bdaddr_type do not need to match.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) bdaddr_type_is_le(la.l2_bdaddr_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /* Old user space versions will try to incorrectly bind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) * the ATT socket using BDADDR_BREDR. We need to accept
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * this and fix up the source address type only when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) * both the source CID and destination CID indicate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) * ATT. Anything else is an invalid combination.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) if (chan->scid != L2CAP_CID_ATT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) /* We don't have the hdev available here to make a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) * better decision on random vs public, but since all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) * user space versions that exhibit this issue anyway do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) * not support random local addresses assuming public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) * here is good enough.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) chan->src_type = BDADDR_LE_PUBLIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) /* We only allow ATT user space socket */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) if (la.l2_cid &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) /* Use L2CAP_MODE_LE_FLOWCTL (CoC) in case of LE address and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) * L2CAP_MODE_EXT_FLOWCTL (ECRED) has not been set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) if (chan->psm && bdaddr_type_is_le(chan->src_type) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) chan->mode != L2CAP_MODE_EXT_FLOWCTL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) chan->mode = L2CAP_MODE_LE_FLOWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) l2cap_sock_init_pid(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) &la.l2_bdaddr, la.l2_bdaddr_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) err = bt_sock_wait_state(sk, BT_CONNECTED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) sock_sndtimeo(sk, flags & O_NONBLOCK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) static int l2cap_sock_listen(struct socket *sock, int backlog)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) BT_DBG("sk %p backlog %d", sk, backlog);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) if (sk->sk_state != BT_BOUND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) err = -EBADFD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) switch (chan->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) case L2CAP_MODE_BASIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) case L2CAP_MODE_LE_FLOWCTL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) case L2CAP_MODE_EXT_FLOWCTL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) if (!enable_ecred) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) err = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) case L2CAP_MODE_ERTM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) case L2CAP_MODE_STREAMING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) if (!disable_ertm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) err = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) l2cap_sock_init_pid(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) sk->sk_max_ack_backlog = backlog;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) sk->sk_ack_backlog = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) /* Listening channels need to use nested locking in order not to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) * cause lockdep warnings when the created child channels end up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) * being locked in the same thread as the parent channel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) chan->state = BT_LISTEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) sk->sk_state = BT_LISTEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) int flags, bool kern)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) DEFINE_WAIT_FUNC(wait, woken_wake_function);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) struct sock *sk = sock->sk, *nsk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) long timeo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) lock_sock_nested(sk, L2CAP_NESTING_PARENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) BT_DBG("sk %p timeo %ld", sk, timeo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) /* Wait for an incoming connection. (wake-one). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) add_wait_queue_exclusive(sk_sleep(sk), &wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) if (sk->sk_state != BT_LISTEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) err = -EBADFD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) nsk = bt_accept_dequeue(sk, newsock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if (nsk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) if (!timeo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) err = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) if (signal_pending(current)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) err = sock_intr_errno(timeo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) lock_sock_nested(sk, L2CAP_NESTING_PARENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) remove_wait_queue(sk_sleep(sk), &wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) newsock->state = SS_CONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) BT_DBG("new socket %p", nsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) int peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) BT_DBG("sock %p, sk %p", sock, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) if (peer && sk->sk_state != BT_CONNECTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) sk->sk_state != BT_CONFIG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) return -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) memset(la, 0, sizeof(struct sockaddr_l2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) addr->sa_family = AF_BLUETOOTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) la->l2_psm = chan->psm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) if (peer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) bacpy(&la->l2_bdaddr, &chan->dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) la->l2_cid = cpu_to_le16(chan->dcid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) la->l2_bdaddr_type = chan->dst_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) bacpy(&la->l2_bdaddr, &chan->src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) la->l2_cid = cpu_to_le16(chan->scid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) la->l2_bdaddr_type = chan->src_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) return sizeof(struct sockaddr_l2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) static int l2cap_get_mode(struct l2cap_chan *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) switch (chan->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) case L2CAP_MODE_BASIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) return BT_MODE_BASIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) case L2CAP_MODE_ERTM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) return BT_MODE_ERTM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) case L2CAP_MODE_STREAMING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) return BT_MODE_STREAMING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) case L2CAP_MODE_LE_FLOWCTL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) return BT_MODE_LE_FLOWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) case L2CAP_MODE_EXT_FLOWCTL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) return BT_MODE_EXT_FLOWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) char __user *optval, int __user *optlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) struct l2cap_options opts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) struct l2cap_conninfo cinfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) int len, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) u32 opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) if (get_user(len, optlen))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) switch (optname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) case L2CAP_OPTIONS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) /* LE sockets should use BT_SNDMTU/BT_RCVMTU, but since
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) * legacy ATT code depends on getsockopt for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) * L2CAP_OPTIONS we need to let this pass.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) if (bdaddr_type_is_le(chan->src_type) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) chan->scid != L2CAP_CID_ATT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) /* Only BR/EDR modes are supported here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) switch (chan->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) case L2CAP_MODE_BASIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) case L2CAP_MODE_ERTM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) case L2CAP_MODE_STREAMING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) memset(&opts, 0, sizeof(opts));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) opts.imtu = chan->imtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) opts.omtu = chan->omtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) opts.flush_to = chan->flush_to;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) opts.mode = chan->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) opts.fcs = chan->fcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) opts.max_tx = chan->max_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) opts.txwin_size = chan->tx_win;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) BT_DBG("mode 0x%2.2x", chan->mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) len = min_t(unsigned int, len, sizeof(opts));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) if (copy_to_user(optval, (char *) &opts, len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) case L2CAP_LM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) switch (chan->sec_level) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) case BT_SECURITY_LOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) opt = L2CAP_LM_AUTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) case BT_SECURITY_MEDIUM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) case BT_SECURITY_HIGH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) L2CAP_LM_SECURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) case BT_SECURITY_FIPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) L2CAP_LM_SECURE | L2CAP_LM_FIPS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) opt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) opt |= L2CAP_LM_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) opt |= L2CAP_LM_RELIABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) if (put_user(opt, (u32 __user *) optval))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) case L2CAP_CONNINFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) if (sk->sk_state != BT_CONNECTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) !(sk->sk_state == BT_CONNECT2 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) err = -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) memset(&cinfo, 0, sizeof(cinfo));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) cinfo.hci_handle = chan->conn->hcon->handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) len = min_t(unsigned int, len, sizeof(cinfo));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) if (copy_to_user(optval, (char *) &cinfo, len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) err = -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) char __user *optval, int __user *optlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) struct bt_security sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) struct bt_power pwr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) u32 phys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) int len, mode, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) if (level == SOL_L2CAP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) if (level != SOL_BLUETOOTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) return -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) if (get_user(len, optlen))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) switch (optname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) case BT_SECURITY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) chan->chan_type != L2CAP_CHAN_FIXED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) chan->chan_type != L2CAP_CHAN_RAW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) memset(&sec, 0, sizeof(sec));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) if (chan->conn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) sec.level = chan->conn->hcon->sec_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) if (sk->sk_state == BT_CONNECTED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) sec.key_size = chan->conn->hcon->enc_key_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) sec.level = chan->sec_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) len = min_t(unsigned int, len, sizeof(sec));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) if (copy_to_user(optval, (char *) &sec, len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) case BT_DEFER_SETUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) (u32 __user *) optval))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) case BT_FLUSHABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) (u32 __user *) optval))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) case BT_POWER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) && sk->sk_type != SOCK_RAW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) len = min_t(unsigned int, len, sizeof(pwr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) if (copy_to_user(optval, (char *) &pwr, len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) case BT_CHANNEL_POLICY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) if (put_user(chan->chan_policy, (u32 __user *) optval))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) case BT_SNDMTU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) if (!bdaddr_type_is_le(chan->src_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) if (sk->sk_state != BT_CONNECTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) err = -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) if (put_user(chan->omtu, (u16 __user *) optval))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) case BT_RCVMTU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) if (!bdaddr_type_is_le(chan->src_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) if (put_user(chan->imtu, (u16 __user *) optval))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) case BT_PHY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) if (sk->sk_state != BT_CONNECTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) err = -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) phys = hci_conn_get_phy(chan->conn->hcon);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) if (put_user(phys, (u32 __user *) optval))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) case BT_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) if (!enable_ecred) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) err = -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) mode = l2cap_get_mode(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) if (mode < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) err = mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) if (put_user(mode, (u8 __user *) optval))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) err = -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) switch (chan->scid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) case L2CAP_CID_ATT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) if (mtu < L2CAP_LE_MIN_MTU)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) if (mtu < L2CAP_DEFAULT_MIN_MTU)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) sockptr_t optval, unsigned int optlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) struct l2cap_options opts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) int len, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) u32 opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) switch (optname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) case L2CAP_OPTIONS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) if (bdaddr_type_is_le(chan->src_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) if (sk->sk_state == BT_CONNECTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) opts.imtu = chan->imtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) opts.omtu = chan->omtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) opts.flush_to = chan->flush_to;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) opts.mode = chan->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) opts.fcs = chan->fcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) opts.max_tx = chan->max_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) opts.txwin_size = chan->tx_win;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) len = min_t(unsigned int, sizeof(opts), optlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) if (copy_from_sockptr(&opts, optval, len)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) if (!l2cap_valid_mtu(chan, opts.imtu)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) /* Only BR/EDR modes are supported here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) switch (opts.mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) case L2CAP_MODE_BASIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) case L2CAP_MODE_ERTM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) case L2CAP_MODE_STREAMING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) if (!disable_ertm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) chan->mode = opts.mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) BT_DBG("mode 0x%2.2x", chan->mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) chan->imtu = opts.imtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) chan->omtu = opts.omtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) chan->fcs = opts.fcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) chan->max_tx = opts.max_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) chan->tx_win = opts.txwin_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) chan->flush_to = opts.flush_to;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) case L2CAP_LM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) if (opt & L2CAP_LM_FIPS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) if (opt & L2CAP_LM_AUTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) chan->sec_level = BT_SECURITY_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) if (opt & L2CAP_LM_ENCRYPT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) chan->sec_level = BT_SECURITY_MEDIUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) if (opt & L2CAP_LM_SECURE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) chan->sec_level = BT_SECURITY_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) if (opt & L2CAP_LM_MASTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) set_bit(FLAG_ROLE_SWITCH, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) if (opt & L2CAP_LM_RELIABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) err = -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) static int l2cap_set_mode(struct l2cap_chan *chan, u8 mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) switch (mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) case BT_MODE_BASIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) if (bdaddr_type_is_le(chan->src_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) mode = L2CAP_MODE_BASIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) case BT_MODE_ERTM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) if (!disable_ertm || bdaddr_type_is_le(chan->src_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) mode = L2CAP_MODE_ERTM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) case BT_MODE_STREAMING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) if (!disable_ertm || bdaddr_type_is_le(chan->src_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) mode = L2CAP_MODE_STREAMING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) case BT_MODE_LE_FLOWCTL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) if (!bdaddr_type_is_le(chan->src_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) mode = L2CAP_MODE_LE_FLOWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) case BT_MODE_EXT_FLOWCTL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) /* TODO: Add support for ECRED PDUs to BR/EDR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) if (!bdaddr_type_is_le(chan->src_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) mode = L2CAP_MODE_EXT_FLOWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) chan->mode = mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) sockptr_t optval, unsigned int optlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) struct bt_security sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) struct bt_power pwr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) struct l2cap_conn *conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) int len, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) u32 opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) u16 mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) u8 mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) if (level == SOL_L2CAP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) if (level != SOL_BLUETOOTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) return -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) switch (optname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) case BT_SECURITY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) chan->chan_type != L2CAP_CHAN_FIXED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) chan->chan_type != L2CAP_CHAN_RAW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) sec.level = BT_SECURITY_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) len = min_t(unsigned int, sizeof(sec), optlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) if (copy_from_sockptr(&sec, optval, len)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) if (sec.level < BT_SECURITY_LOW ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) sec.level > BT_SECURITY_FIPS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) chan->sec_level = sec.level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) if (!chan->conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) conn = chan->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) /* change security for LE channels */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) if (chan->scid == L2CAP_CID_ATT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) if (smp_conn_security(conn->hcon, sec.level)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) set_bit(FLAG_PENDING_SECURITY, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) sk->sk_state = BT_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) chan->state = BT_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) /* or for ACL link */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) } else if ((sk->sk_state == BT_CONNECT2 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) sk->sk_state == BT_CONNECTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) if (!l2cap_chan_check_security(chan, true))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) sk->sk_state_change(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) case BT_DEFER_SETUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) if (opt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) set_bit(FLAG_DEFER_SETUP, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) clear_bit(FLAG_DEFER_SETUP, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) case BT_FLUSHABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) if (opt > BT_FLUSHABLE_ON) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) if (opt == BT_FLUSHABLE_OFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) conn = chan->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) /* proceed further only when we have l2cap_conn and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) No Flush support in the LM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) if (opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) set_bit(FLAG_FLUSHABLE, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) clear_bit(FLAG_FLUSHABLE, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) case BT_POWER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) chan->chan_type != L2CAP_CHAN_RAW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) len = min_t(unsigned int, sizeof(pwr), optlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) if (copy_from_sockptr(&pwr, optval, len)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) if (pwr.force_active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) case BT_CHANNEL_POLICY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) if (chan->mode != L2CAP_MODE_ERTM &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) chan->mode != L2CAP_MODE_STREAMING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) err = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) chan->chan_policy = (u8) opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) if (sk->sk_state == BT_CONNECTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) chan->move_role == L2CAP_MOVE_ROLE_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) l2cap_move_start(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) case BT_SNDMTU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) if (!bdaddr_type_is_le(chan->src_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) /* Setting is not supported as it's the remote side that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) * decides this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) err = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) case BT_RCVMTU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) if (!bdaddr_type_is_le(chan->src_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) if (chan->mode == L2CAP_MODE_LE_FLOWCTL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) sk->sk_state == BT_CONNECTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) err = -EISCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) if (copy_from_sockptr(&mtu, optval, sizeof(u16))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) if (chan->mode == L2CAP_MODE_EXT_FLOWCTL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) sk->sk_state == BT_CONNECTED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) err = l2cap_chan_reconfigure(chan, mtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) chan->imtu = mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) case BT_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) if (!enable_ecred) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) err = -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) BT_DBG("sk->sk_state %u", sk->sk_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) if (sk->sk_state != BT_BOUND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) if (copy_from_sockptr(&mode, optval, sizeof(u8))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) BT_DBG("mode %u", mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) err = l2cap_set_mode(chan, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) BT_DBG("mode 0x%2.2x", chan->mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) err = -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) static int l2cap_sock_sendmsg(struct socket *sock, struct msghdr *msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) BT_DBG("sock %p, sk %p", sock, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) err = sock_error(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) if (msg->msg_flags & MSG_OOB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) if (sk->sk_state != BT_CONNECTED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) return -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) err = bt_sock_wait_ready(sk, msg->msg_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) l2cap_chan_lock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) err = l2cap_chan_send(chan, msg, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) l2cap_chan_unlock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) static int l2cap_sock_recvmsg(struct socket *sock, struct msghdr *msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) size_t len, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) struct l2cap_pinfo *pi = l2cap_pi(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) &bt_sk(sk)->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) if (pi->chan->mode == L2CAP_MODE_EXT_FLOWCTL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) sk->sk_state = BT_CONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) pi->chan->state = BT_CONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) __l2cap_ecred_conn_rsp_defer(pi->chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) } else if (bdaddr_type_is_le(pi->chan->src_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) sk->sk_state = BT_CONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) pi->chan->state = BT_CONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) __l2cap_le_connect_rsp_defer(pi->chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) sk->sk_state = BT_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) pi->chan->state = BT_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) __l2cap_connect_rsp_defer(pi->chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) if (sock->type == SOCK_STREAM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) err = bt_sock_stream_recvmsg(sock, msg, len, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) err = bt_sock_recvmsg(sock, msg, len, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) if (pi->chan->mode != L2CAP_MODE_ERTM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) /* Attempt to put pending rx data in the socket buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) if (pi->rx_busy_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) if (!__sock_queue_rcv_skb(sk, pi->rx_busy_skb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) pi->rx_busy_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) /* Restore data flow when half of the receive buffer is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) * available. This avoids resending large numbers of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) * frames.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) l2cap_chan_busy(pi->chan, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) /* Kill socket (only if zapped and orphan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) * Must be called on unlocked socket, with l2cap channel lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) static void l2cap_sock_kill(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) /* Kill poor orphan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) l2cap_chan_put(l2cap_pi(sk)->chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) sock_set_flag(sk, SOCK_DEAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) sock_put(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) static int __l2cap_wait_ack(struct sock *sk, struct l2cap_chan *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) DECLARE_WAITQUEUE(wait, current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) int timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) /* Timeout to prevent infinite loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) unsigned long timeout = jiffies + L2CAP_WAIT_ACK_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) add_wait_queue(sk_sleep(sk), &wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) set_current_state(TASK_INTERRUPTIBLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) BT_DBG("Waiting for %d ACKs, timeout %04d ms",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) chan->unacked_frames, time_after(jiffies, timeout) ? 0 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) jiffies_to_msecs(timeout - jiffies));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) if (!timeo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) if (signal_pending(current)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) err = sock_intr_errno(timeo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) timeo = schedule_timeout(timeo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) set_current_state(TASK_INTERRUPTIBLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) err = sock_error(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) if (time_after(jiffies, timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) err = -ENOLINK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) } while (chan->unacked_frames > 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) chan->state == BT_CONNECTED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) set_current_state(TASK_RUNNING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) remove_wait_queue(sk_sleep(sk), &wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) static int l2cap_sock_shutdown(struct socket *sock, int how)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) struct l2cap_chan *chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) struct l2cap_conn *conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) BT_DBG("sock %p, sk %p, how %d", sock, sk, how);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) /* 'how' parameter is mapped to sk_shutdown as follows:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) * SHUT_RD (0) --> RCV_SHUTDOWN (1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) * SHUT_WR (1) --> SEND_SHUTDOWN (2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) * SHUT_RDWR (2) --> SHUTDOWN_MASK (3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) how++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) if ((sk->sk_shutdown & how) == how)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) goto shutdown_already;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) BT_DBG("Handling sock shutdown");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) /* prevent sk structure from being freed whilst unlocked */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) sock_hold(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) /* prevent chan structure from being freed whilst unlocked */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) l2cap_chan_hold(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) if (chan->mode == L2CAP_MODE_ERTM &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) chan->unacked_frames > 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) chan->state == BT_CONNECTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) err = __l2cap_wait_ack(sk, chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) /* After waiting for ACKs, check whether shutdown
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) * has already been actioned to close the L2CAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) * link such as by l2cap_disconnection_req().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) if ((sk->sk_shutdown & how) == how)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) goto shutdown_matched;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) /* Try setting the RCV_SHUTDOWN bit, return early if SEND_SHUTDOWN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) * is already set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) if ((how & RCV_SHUTDOWN) && !(sk->sk_shutdown & RCV_SHUTDOWN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) sk->sk_shutdown |= RCV_SHUTDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) if ((sk->sk_shutdown & how) == how)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) goto shutdown_matched;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) sk->sk_shutdown |= SEND_SHUTDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) l2cap_chan_lock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) conn = chan->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) if (conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) /* prevent conn structure from being freed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) l2cap_conn_get(conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) l2cap_chan_unlock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) if (conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) /* mutex lock must be taken before l2cap_chan_lock() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) mutex_lock(&conn->chan_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) l2cap_chan_lock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) l2cap_chan_close(chan, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) l2cap_chan_unlock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) if (conn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) mutex_unlock(&conn->chan_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) l2cap_conn_put(conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) !(current->flags & PF_EXITING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) err = bt_sock_wait_state(sk, BT_CLOSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) sk->sk_lingertime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) shutdown_matched:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) l2cap_chan_put(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) sock_put(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) shutdown_already:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) if (!err && sk->sk_err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) err = -sk->sk_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) BT_DBG("Sock shutdown complete err: %d", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) static int l2cap_sock_release(struct socket *sock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) struct l2cap_chan *chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) BT_DBG("sock %p, sk %p", sock, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) bt_sock_unlink(&l2cap_sk_list, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) err = l2cap_sock_shutdown(sock, SHUT_RDWR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) l2cap_chan_hold(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) l2cap_chan_lock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) sock_orphan(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) l2cap_sock_kill(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) l2cap_chan_unlock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) l2cap_chan_put(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) static void l2cap_sock_cleanup_listen(struct sock *parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) struct sock *sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) BT_DBG("parent %p state %s", parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) state_to_string(parent->sk_state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) /* Close not yet accepted channels */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) while ((sk = bt_accept_dequeue(parent, NULL))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) BT_DBG("child chan %p state %s", chan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) state_to_string(chan->state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) l2cap_chan_hold(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) l2cap_chan_lock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) __clear_chan_timer(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) l2cap_chan_close(chan, ECONNRESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) l2cap_sock_kill(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) l2cap_chan_unlock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) l2cap_chan_put(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) struct sock *sk, *parent = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) lock_sock(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) /* Check for backlog size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) if (sk_acceptq_is_full(parent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) BT_DBG("backlog full %d", parent->sk_ack_backlog);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) release_sock(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) GFP_ATOMIC, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) if (!sk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) release_sock(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) l2cap_sock_init(sk, parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) bt_accept_enqueue(parent, sk, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) release_sock(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) return l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) if (l2cap_pi(sk)->rx_busy_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) if (chan->mode != L2CAP_MODE_ERTM &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) chan->mode != L2CAP_MODE_STREAMING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) /* Even if no filter is attached, we could potentially
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) * get errors from security modules, etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) err = sk_filter(sk, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) err = __sock_queue_rcv_skb(sk, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) /* For ERTM, handle one skb that doesn't fit into the recv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) * buffer. This is important to do because the data frames
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) * have already been acked, so the skb cannot be discarded.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) * Notify the l2cap core that the buffer is full, so the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) * LOCAL_BUSY state is entered and no more frames are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) * acked and reassembled until there is buffer space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) * available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) l2cap_pi(sk)->rx_busy_skb = skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) l2cap_chan_busy(chan, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) static void l2cap_sock_close_cb(struct l2cap_chan *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) l2cap_sock_kill(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) struct sock *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) /* This callback can be called both for server (BT_LISTEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) * sockets as well as "normal" ones. To avoid lockdep warnings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) * with child socket locking (through l2cap_sock_cleanup_listen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) * we need separation into separate nesting levels. The simplest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) * way to accomplish this is to inherit the nesting level used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) * for the channel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) lock_sock_nested(sk, atomic_read(&chan->nesting));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) parent = bt_sk(sk)->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) switch (chan->state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) case BT_OPEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) case BT_BOUND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) case BT_CLOSED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) case BT_LISTEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) l2cap_sock_cleanup_listen(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) sk->sk_state = BT_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) chan->state = BT_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) sk->sk_state = BT_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) chan->state = BT_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) sk->sk_err = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) if (parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) bt_accept_unlink(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) parent->sk_data_ready(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) sk->sk_state_change(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) /* Only zap after cleanup to avoid use after free race */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) sock_set_flag(sk, SOCK_ZAPPED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) int err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) sk->sk_state = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) sk->sk_err = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) unsigned long hdr_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) unsigned long len, int nb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) l2cap_chan_unlock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) skb = bt_skb_send_alloc(sk, hdr_len + len, nb, &err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) l2cap_chan_lock(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) skb->priority = sk->sk_priority;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) bt_cb(skb)->l2cap.chan = chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) return skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) struct sock *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) parent = bt_sk(sk)->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) BT_DBG("sk %p, parent %p", sk, parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) sk->sk_state = BT_CONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) sk->sk_state_change(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) if (parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) parent->sk_data_ready(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) struct sock *parent, *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) parent = bt_sk(sk)->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) if (parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) parent->sk_data_ready(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) sk->sk_state = BT_CONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) chan->state = BT_CONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) sk->sk_state_change(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) sk->sk_shutdown = SHUTDOWN_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) return sk->sk_sndtimeo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) static struct pid *l2cap_sock_get_peer_pid_cb(struct l2cap_chan *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) return sk->sk_peer_pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) sk->sk_state_change(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) static int l2cap_sock_filter(struct l2cap_chan *chan, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) struct sock *sk = chan->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) switch (chan->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) case L2CAP_MODE_ERTM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) case L2CAP_MODE_STREAMING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) return sk_filter(sk, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) static const struct l2cap_ops l2cap_chan_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) .name = "L2CAP Socket Interface",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) .new_connection = l2cap_sock_new_connection_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) .recv = l2cap_sock_recv_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) .close = l2cap_sock_close_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) .teardown = l2cap_sock_teardown_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) .state_change = l2cap_sock_state_change_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) .ready = l2cap_sock_ready_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) .defer = l2cap_sock_defer_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) .resume = l2cap_sock_resume_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) .suspend = l2cap_sock_suspend_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) .set_shutdown = l2cap_sock_set_shutdown_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) .get_peer_pid = l2cap_sock_get_peer_pid_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) .alloc_skb = l2cap_sock_alloc_skb_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) .filter = l2cap_sock_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) static void l2cap_sock_destruct(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) if (l2cap_pi(sk)->chan) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) l2cap_pi(sk)->chan->data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) l2cap_chan_put(l2cap_pi(sk)->chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) if (l2cap_pi(sk)->rx_busy_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) kfree_skb(l2cap_pi(sk)->rx_busy_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) l2cap_pi(sk)->rx_busy_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) skb_queue_purge(&sk->sk_receive_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) skb_queue_purge(&sk->sk_write_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) int *msg_namelen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) memset(la, 0, sizeof(struct sockaddr_l2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) la->l2_family = AF_BLUETOOTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) la->l2_psm = bt_cb(skb)->l2cap.psm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) bacpy(&la->l2_bdaddr, &bt_cb(skb)->l2cap.bdaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) *msg_namelen = sizeof(struct sockaddr_l2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) static void l2cap_sock_init(struct sock *sk, struct sock *parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) struct l2cap_chan *chan = l2cap_pi(sk)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) if (parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) sk->sk_type = parent->sk_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) bt_sk(sk)->flags = bt_sk(parent)->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) chan->chan_type = pchan->chan_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) chan->imtu = pchan->imtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) chan->omtu = pchan->omtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) chan->conf_state = pchan->conf_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) chan->mode = pchan->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) chan->fcs = pchan->fcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) chan->max_tx = pchan->max_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) chan->tx_win = pchan->tx_win;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) chan->tx_win_max = pchan->tx_win_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) chan->sec_level = pchan->sec_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) chan->flags = pchan->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) chan->tx_credits = pchan->tx_credits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) chan->rx_credits = pchan->rx_credits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) if (chan->chan_type == L2CAP_CHAN_FIXED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) chan->scid = pchan->scid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) chan->dcid = pchan->scid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) security_sk_clone(parent, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) switch (sk->sk_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) case SOCK_RAW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) chan->chan_type = L2CAP_CHAN_RAW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) case SOCK_DGRAM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) chan->chan_type = L2CAP_CHAN_CONN_LESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) case SOCK_SEQPACKET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) case SOCK_STREAM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) chan->imtu = L2CAP_DEFAULT_MTU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) chan->omtu = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) chan->mode = L2CAP_MODE_ERTM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) chan->mode = L2CAP_MODE_BASIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) l2cap_chan_set_defaults(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) /* Default config options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) chan->data = sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) chan->ops = &l2cap_chan_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) static struct proto l2cap_proto = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) .name = "L2CAP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) .obj_size = sizeof(struct l2cap_pinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) int proto, gfp_t prio, int kern)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) struct sock *sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) struct l2cap_chan *chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto, kern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) sock_init_data(sock, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) sk->sk_destruct = l2cap_sock_destruct;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) sock_reset_flag(sk, SOCK_ZAPPED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) sk->sk_protocol = proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) sk->sk_state = BT_OPEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) chan = l2cap_chan_create();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) if (!chan) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) sk_free(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) l2cap_chan_hold(chan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) l2cap_pi(sk)->chan = chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) return sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) int kern)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) struct sock *sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) BT_DBG("sock %p", sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) sock->state = SS_UNCONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) return -ESOCKTNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) sock->ops = &l2cap_sock_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) l2cap_sock_init(sk, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) bt_sock_link(&l2cap_sk_list, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) static const struct proto_ops l2cap_sock_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) .family = PF_BLUETOOTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) .release = l2cap_sock_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) .bind = l2cap_sock_bind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) .connect = l2cap_sock_connect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) .listen = l2cap_sock_listen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) .accept = l2cap_sock_accept,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) .getname = l2cap_sock_getname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) .sendmsg = l2cap_sock_sendmsg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) .recvmsg = l2cap_sock_recvmsg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) .poll = bt_sock_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) .ioctl = bt_sock_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) .gettstamp = sock_gettstamp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) .mmap = sock_no_mmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) .socketpair = sock_no_socketpair,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) .shutdown = l2cap_sock_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) .setsockopt = l2cap_sock_setsockopt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) .getsockopt = l2cap_sock_getsockopt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) static const struct net_proto_family l2cap_sock_family_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) .family = PF_BLUETOOTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) .create = l2cap_sock_create,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) int __init l2cap_init_sockets(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) BUILD_BUG_ON(sizeof(struct sockaddr_l2) > sizeof(struct sockaddr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) err = proto_register(&l2cap_proto, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) BT_ERR("L2CAP socket registration failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) BT_ERR("Failed to create L2CAP proc file");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) bt_sock_unregister(BTPROTO_L2CAP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) BT_INFO("L2CAP socket layer initialized");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) proto_unregister(&l2cap_proto);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) void l2cap_cleanup_sockets(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) bt_procfs_cleanup(&init_net, "l2cap");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) bt_sock_unregister(BTPROTO_L2CAP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) proto_unregister(&l2cap_proto);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) }