^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) RFCOMM implementation for Linux Bluetooth stack (BlueZ).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) it under the terms of the GNU General Public License version 2 as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) published by the Free Software Foundation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) SOFTWARE IS DISCLAIMED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * RFCOMM sockets.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/compat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/debugfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/sched/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <net/bluetooth/bluetooth.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <net/bluetooth/hci_core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <net/bluetooth/l2cap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <net/bluetooth/rfcomm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static const struct proto_ops rfcomm_sock_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) static struct bt_sock_list rfcomm_sk_list = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) .lock = __RW_LOCK_UNLOCKED(rfcomm_sk_list.lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) static void rfcomm_sock_close(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) static void rfcomm_sock_kill(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) /* ---- DLC callbacks ----
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * called under rfcomm_dlc_lock()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) static void rfcomm_sk_data_ready(struct rfcomm_dlc *d, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) struct sock *sk = d->owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) atomic_add(skb->len, &sk->sk_rmem_alloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) skb_queue_tail(&sk->sk_receive_queue, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) sk->sk_data_ready(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) rfcomm_dlc_throttle(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct sock *sk = d->owner, *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) BT_DBG("dlc %p state %ld err %d", d, d->state, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) spin_lock_bh(&sk->sk_lock.slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) sk->sk_err = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) sk->sk_state = d->state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) parent = bt_sk(sk)->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) if (parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) if (d->state == BT_CLOSED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) sock_set_flag(sk, SOCK_ZAPPED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) bt_accept_unlink(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) parent->sk_data_ready(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) if (d->state == BT_CONNECTED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) rfcomm_session_getaddr(d->session,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) &rfcomm_pi(sk)->src, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) sk->sk_state_change(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) spin_unlock_bh(&sk->sk_lock.slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) if (parent && sock_flag(sk, SOCK_ZAPPED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /* We have to drop DLC lock here, otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * rfcomm_sock_destruct() will dead lock. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) rfcomm_dlc_unlock(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) rfcomm_sock_kill(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) rfcomm_dlc_lock(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* ---- Socket functions ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) static struct sock *__rfcomm_get_listen_sock_by_addr(u8 channel, bdaddr_t *src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct sock *sk = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) sk_for_each(sk, &rfcomm_sk_list.head) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) if (rfcomm_pi(sk)->channel != channel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) if (bacmp(&rfcomm_pi(sk)->src, src))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) if (sk->sk_state == BT_BOUND || sk->sk_state == BT_LISTEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) return sk ? sk : NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) /* Find socket with channel and source bdaddr.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) * Returns closest match.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) static struct sock *rfcomm_get_sock_by_channel(int state, u8 channel, bdaddr_t *src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct sock *sk = NULL, *sk1 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) read_lock(&rfcomm_sk_list.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) sk_for_each(sk, &rfcomm_sk_list.head) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) if (state && sk->sk_state != state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) if (rfcomm_pi(sk)->channel == channel) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* Exact match. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) if (!bacmp(&rfcomm_pi(sk)->src, src))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /* Closest match */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) if (!bacmp(&rfcomm_pi(sk)->src, BDADDR_ANY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) sk1 = sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) read_unlock(&rfcomm_sk_list.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) return sk ? sk : sk1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) static void rfcomm_sock_destruct(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) BT_DBG("sk %p dlc %p", sk, d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) skb_queue_purge(&sk->sk_receive_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) skb_queue_purge(&sk->sk_write_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) rfcomm_dlc_lock(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) rfcomm_pi(sk)->dlc = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /* Detach DLC if it's owned by this socket */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) if (d->owner == sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) d->owner = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) rfcomm_dlc_unlock(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) rfcomm_dlc_put(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) static void rfcomm_sock_cleanup_listen(struct sock *parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) struct sock *sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) BT_DBG("parent %p", parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) /* Close not yet accepted dlcs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) while ((sk = bt_accept_dequeue(parent, NULL))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) rfcomm_sock_close(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) rfcomm_sock_kill(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) parent->sk_state = BT_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) sock_set_flag(parent, SOCK_ZAPPED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) /* Kill socket (only if zapped and orphan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) * Must be called on unlocked socket.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) static void rfcomm_sock_kill(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) BT_DBG("sk %p state %d refcnt %d", sk, sk->sk_state, refcount_read(&sk->sk_refcnt));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /* Kill poor orphan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) bt_sock_unlink(&rfcomm_sk_list, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) sock_set_flag(sk, SOCK_DEAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) sock_put(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) static void __rfcomm_sock_close(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) switch (sk->sk_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) case BT_LISTEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) rfcomm_sock_cleanup_listen(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) case BT_CONNECT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) case BT_CONNECT2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) case BT_CONFIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) case BT_CONNECTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) rfcomm_dlc_close(d, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) sock_set_flag(sk, SOCK_ZAPPED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) /* Close socket.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) * Must be called on unlocked socket.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) static void rfcomm_sock_close(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) __rfcomm_sock_close(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) static void rfcomm_sock_init(struct sock *sk, struct sock *parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) struct rfcomm_pinfo *pi = rfcomm_pi(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) if (parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) sk->sk_type = parent->sk_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) pi->dlc->defer_setup = test_bit(BT_SK_DEFER_SETUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) &bt_sk(parent)->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) pi->sec_level = rfcomm_pi(parent)->sec_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) pi->role_switch = rfcomm_pi(parent)->role_switch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) security_sk_clone(parent, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) pi->dlc->defer_setup = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) pi->sec_level = BT_SECURITY_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) pi->role_switch = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) pi->dlc->sec_level = pi->sec_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) pi->dlc->role_switch = pi->role_switch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) static struct proto rfcomm_proto = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) .name = "RFCOMM",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) .obj_size = sizeof(struct rfcomm_pinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) static struct sock *rfcomm_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio, int kern)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) struct rfcomm_dlc *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) struct sock *sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) sk = sk_alloc(net, PF_BLUETOOTH, prio, &rfcomm_proto, kern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) sock_init_data(sock, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) d = rfcomm_dlc_alloc(prio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) if (!d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) sk_free(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) d->data_ready = rfcomm_sk_data_ready;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) d->state_change = rfcomm_sk_state_change;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) rfcomm_pi(sk)->dlc = d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) d->owner = sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) sk->sk_destruct = rfcomm_sock_destruct;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) sk->sk_sndtimeo = RFCOMM_CONN_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) sk->sk_sndbuf = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) sk->sk_rcvbuf = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) sock_reset_flag(sk, SOCK_ZAPPED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) sk->sk_protocol = proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) sk->sk_state = BT_OPEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) bt_sock_link(&rfcomm_sk_list, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) return sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) static int rfcomm_sock_create(struct net *net, struct socket *sock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) int protocol, int kern)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) struct sock *sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) BT_DBG("sock %p", sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) sock->state = SS_UNCONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if (sock->type != SOCK_STREAM && sock->type != SOCK_RAW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) return -ESOCKTNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) sock->ops = &rfcomm_sock_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) sk = rfcomm_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) rfcomm_sock_init(sk, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) static int rfcomm_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) struct sockaddr_rc sa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) int len, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) if (!addr || addr_len < offsetofend(struct sockaddr, sa_family) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) addr->sa_family != AF_BLUETOOTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) memset(&sa, 0, sizeof(sa));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) len = min_t(unsigned int, sizeof(sa), addr_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) memcpy(&sa, addr, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) BT_DBG("sk %p %pMR", sk, &sa.rc_bdaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) if (sk->sk_state != BT_OPEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) err = -EBADFD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) if (sk->sk_type != SOCK_STREAM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) write_lock(&rfcomm_sk_list.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) if (sa.rc_channel &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) __rfcomm_get_listen_sock_by_addr(sa.rc_channel, &sa.rc_bdaddr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) err = -EADDRINUSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /* Save source address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) bacpy(&rfcomm_pi(sk)->src, &sa.rc_bdaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) rfcomm_pi(sk)->channel = sa.rc_channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) sk->sk_state = BT_BOUND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) write_unlock(&rfcomm_sk_list.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) return err;
^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) static int rfcomm_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) if (alen < sizeof(struct sockaddr_rc) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) addr->sa_family != AF_BLUETOOTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) err = -EBADFD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) goto done;
^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) if (sk->sk_type != SOCK_STREAM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) sk->sk_state = BT_CONNECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) bacpy(&rfcomm_pi(sk)->dst, &sa->rc_bdaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) rfcomm_pi(sk)->channel = sa->rc_channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) d->sec_level = rfcomm_pi(sk)->sec_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) d->role_switch = rfcomm_pi(sk)->role_switch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) err = rfcomm_dlc_open(d, &rfcomm_pi(sk)->src, &sa->rc_bdaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) sa->rc_channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) err = bt_sock_wait_state(sk, BT_CONNECTED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) sock_sndtimeo(sk, flags & O_NONBLOCK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) static int rfcomm_sock_listen(struct socket *sock, int backlog)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) BT_DBG("sk %p backlog %d", sk, backlog);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) if (sk->sk_state != BT_BOUND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) err = -EBADFD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) if (sk->sk_type != SOCK_STREAM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) if (!rfcomm_pi(sk)->channel) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) bdaddr_t *src = &rfcomm_pi(sk)->src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) u8 channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) write_lock(&rfcomm_sk_list.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) for (channel = 1; channel < 31; channel++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) if (!__rfcomm_get_listen_sock_by_addr(channel, src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) rfcomm_pi(sk)->channel = channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) write_unlock(&rfcomm_sk_list.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) sk->sk_max_ack_backlog = backlog;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) sk->sk_ack_backlog = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) sk->sk_state = BT_LISTEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) bool kern)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) DEFINE_WAIT_FUNC(wait, woken_wake_function);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) struct sock *sk = sock->sk, *nsk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) long timeo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) if (sk->sk_type != SOCK_STREAM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) BT_DBG("sk %p timeo %ld", sk, timeo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) /* Wait for an incoming connection. (wake-one). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) add_wait_queue_exclusive(sk_sleep(sk), &wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) if (sk->sk_state != BT_LISTEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) err = -EBADFD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) nsk = bt_accept_dequeue(sk, newsock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) if (nsk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) if (!timeo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) err = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) if (signal_pending(current)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) err = sock_intr_errno(timeo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) remove_wait_queue(sk_sleep(sk), &wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) newsock->state = SS_CONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) BT_DBG("new socket %p", nsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) BT_DBG("sock %p, sk %p", sock, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) if (peer && sk->sk_state != BT_CONNECTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) return -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) memset(sa, 0, sizeof(*sa));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) sa->rc_family = AF_BLUETOOTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) sa->rc_channel = rfcomm_pi(sk)->channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) if (peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) bacpy(&sa->rc_bdaddr, &rfcomm_pi(sk)->dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) bacpy(&sa->rc_bdaddr, &rfcomm_pi(sk)->src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) return sizeof(struct sockaddr_rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) static int rfcomm_sock_sendmsg(struct socket *sock, struct msghdr *msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) int sent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) if (test_bit(RFCOMM_DEFER_SETUP, &d->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) return -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) if (msg->msg_flags & MSG_OOB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) if (sk->sk_shutdown & SEND_SHUTDOWN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) return -EPIPE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) BT_DBG("sock %p, sk %p", sock, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) sent = bt_sock_wait_ready(sk, msg->msg_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) if (sent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) while (len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) size_t size = min_t(size_t, len, d->mtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) skb = sock_alloc_send_skb(sk, size + RFCOMM_SKB_RESERVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) msg->msg_flags & MSG_DONTWAIT, &err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) if (sent == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) sent = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) err = memcpy_from_msg(skb_put(skb, size), msg, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) if (sent == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) sent = err;
^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) skb->priority = sk->sk_priority;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) err = rfcomm_dlc_send(d, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) if (sent == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) sent = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) break;
^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) sent += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) len -= size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) return sent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) static int rfcomm_sock_recvmsg(struct socket *sock, struct msghdr *msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) size_t size, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) rfcomm_dlc_accept(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) len = bt_sock_stream_recvmsg(sock, msg, size, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) if (!(flags & MSG_PEEK) && len > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) atomic_sub(len, &sk->sk_rmem_alloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) if (atomic_read(&sk->sk_rmem_alloc) <= (sk->sk_rcvbuf >> 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) rfcomm_dlc_unthrottle(rfcomm_pi(sk)->dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) sockptr_t optval, unsigned int optlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) u32 opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) switch (optname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) case RFCOMM_LM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) if (opt & RFCOMM_LM_FIPS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) if (opt & RFCOMM_LM_AUTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) rfcomm_pi(sk)->sec_level = BT_SECURITY_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) if (opt & RFCOMM_LM_ENCRYPT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) rfcomm_pi(sk)->sec_level = BT_SECURITY_MEDIUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) if (opt & RFCOMM_LM_SECURE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) rfcomm_pi(sk)->sec_level = BT_SECURITY_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) rfcomm_pi(sk)->role_switch = (opt & RFCOMM_LM_MASTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) err = -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) sockptr_t optval, unsigned int optlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) struct bt_security sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) size_t len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) u32 opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) if (level == SOL_RFCOMM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) return rfcomm_sock_setsockopt_old(sock, optname, optval, optlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) if (level != SOL_BLUETOOTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) return -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) switch (optname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) case BT_SECURITY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) if (sk->sk_type != SOCK_STREAM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) sec.level = BT_SECURITY_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) len = min_t(unsigned int, sizeof(sec), optlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) if (copy_from_sockptr(&sec, optval, len)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) if (sec.level > BT_SECURITY_HIGH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) rfcomm_pi(sk)->sec_level = sec.level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) case BT_DEFER_SETUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) break;
^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) if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) if (opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) err = -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) struct sock *l2cap_sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) struct l2cap_conn *conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) struct rfcomm_conninfo cinfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) int len, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) u32 opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) if (get_user(len, optlen))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) switch (optname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) case RFCOMM_LM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) switch (rfcomm_pi(sk)->sec_level) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) case BT_SECURITY_LOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) opt = RFCOMM_LM_AUTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) case BT_SECURITY_MEDIUM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) opt = RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) case BT_SECURITY_HIGH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) opt = RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) RFCOMM_LM_SECURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) case BT_SECURITY_FIPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) opt = RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) RFCOMM_LM_SECURE | RFCOMM_LM_FIPS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) opt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) if (rfcomm_pi(sk)->role_switch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) opt |= RFCOMM_LM_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) if (put_user(opt, (u32 __user *) optval))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) case RFCOMM_CONNINFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) if (sk->sk_state != BT_CONNECTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) !rfcomm_pi(sk)->dlc->defer_setup) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) err = -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) l2cap_sk = rfcomm_pi(sk)->dlc->session->sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) conn = l2cap_pi(l2cap_sk)->chan->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) memset(&cinfo, 0, sizeof(cinfo));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) cinfo.hci_handle = conn->hcon->handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) memcpy(cinfo.dev_class, conn->hcon->dev_class, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) len = min_t(unsigned int, len, sizeof(cinfo));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) if (copy_to_user(optval, (char *) &cinfo, len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^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) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) err = -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) struct bt_security sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) int len, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) BT_DBG("sk %p", sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) if (level == SOL_RFCOMM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) return rfcomm_sock_getsockopt_old(sock, optname, optval, optlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) if (level != SOL_BLUETOOTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) return -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) if (get_user(len, optlen))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) switch (optname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) case BT_SECURITY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) if (sk->sk_type != SOCK_STREAM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) sec.level = rfcomm_pi(sk)->sec_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) sec.key_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) len = min_t(unsigned int, len, sizeof(sec));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) if (copy_to_user(optval, (char *) &sec, len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) case BT_DEFER_SETUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) (u32 __user *) optval))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) err = -ENOPROTOOPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) static int rfcomm_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) struct sock *sk __maybe_unused = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) err = bt_sock_ioctl(sock, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) if (err == -ENOIOCTLCMD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) #ifdef CONFIG_BT_RFCOMM_TTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) err = rfcomm_dev_ioctl(sk, cmd, (void __user *) arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) err = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) static int rfcomm_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) return rfcomm_sock_ioctl(sock, cmd, (unsigned long)compat_ptr(arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) static int rfcomm_sock_shutdown(struct socket *sock, int how)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) BT_DBG("sock %p, sk %p", sock, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) if (!sk->sk_shutdown) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) sk->sk_shutdown = SHUTDOWN_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) __rfcomm_sock_close(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) !(current->flags & PF_EXITING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) static int rfcomm_sock_release(struct socket *sock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) struct sock *sk = sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) BT_DBG("sock %p, sk %p", sock, sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) err = rfcomm_sock_shutdown(sock, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) sock_orphan(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) rfcomm_sock_kill(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) /* ---- RFCOMM core layer callbacks ----
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) * called under rfcomm_lock()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc **d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) struct sock *sk, *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) bdaddr_t src, dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) int result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) BT_DBG("session %p channel %d", s, channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) rfcomm_session_getaddr(s, &src, &dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) /* Check if we have socket listening on channel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) parent = rfcomm_get_sock_by_channel(BT_LISTEN, channel, &src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) if (!parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) bh_lock_sock(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) /* Check for backlog size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) if (sk_acceptq_is_full(parent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) BT_DBG("backlog full %d", parent->sk_ack_backlog);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) sk = rfcomm_sock_alloc(sock_net(parent), NULL, BTPROTO_RFCOMM, GFP_ATOMIC, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) if (!sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) bt_sock_reclassify_lock(sk, BTPROTO_RFCOMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) rfcomm_sock_init(sk, parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) bacpy(&rfcomm_pi(sk)->src, &src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) bacpy(&rfcomm_pi(sk)->dst, &dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) rfcomm_pi(sk)->channel = channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) sk->sk_state = BT_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) bt_accept_enqueue(parent, sk, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) /* Accept connection and return socket DLC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) *d = rfcomm_pi(sk)->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) result = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) bh_unlock_sock(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) parent->sk_state_change(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) static int rfcomm_sock_debugfs_show(struct seq_file *f, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) struct sock *sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) read_lock(&rfcomm_sk_list.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) sk_for_each(sk, &rfcomm_sk_list.head) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) seq_printf(f, "%pMR %pMR %d %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) &rfcomm_pi(sk)->src, &rfcomm_pi(sk)->dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) sk->sk_state, rfcomm_pi(sk)->channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) read_unlock(&rfcomm_sk_list.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) DEFINE_SHOW_ATTRIBUTE(rfcomm_sock_debugfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) static struct dentry *rfcomm_sock_debugfs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) static const struct proto_ops rfcomm_sock_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) .family = PF_BLUETOOTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) .release = rfcomm_sock_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) .bind = rfcomm_sock_bind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) .connect = rfcomm_sock_connect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) .listen = rfcomm_sock_listen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) .accept = rfcomm_sock_accept,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) .getname = rfcomm_sock_getname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) .sendmsg = rfcomm_sock_sendmsg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) .recvmsg = rfcomm_sock_recvmsg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) .shutdown = rfcomm_sock_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) .setsockopt = rfcomm_sock_setsockopt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) .getsockopt = rfcomm_sock_getsockopt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) .ioctl = rfcomm_sock_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) .gettstamp = sock_gettstamp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) .poll = bt_sock_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) .socketpair = sock_no_socketpair,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) .mmap = sock_no_mmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) .compat_ioctl = rfcomm_sock_compat_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) static const struct net_proto_family rfcomm_sock_family_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) .family = PF_BLUETOOTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) .create = rfcomm_sock_create
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) int __init rfcomm_init_sockets(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) BUILD_BUG_ON(sizeof(struct sockaddr_rc) > sizeof(struct sockaddr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) err = proto_register(&rfcomm_proto, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) err = bt_sock_register(BTPROTO_RFCOMM, &rfcomm_sock_family_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) BT_ERR("RFCOMM socket layer registration failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) err = bt_procfs_init(&init_net, "rfcomm", &rfcomm_sk_list, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) BT_ERR("Failed to create RFCOMM proc file");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) bt_sock_unregister(BTPROTO_RFCOMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) BT_INFO("RFCOMM socket layer initialized");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) if (IS_ERR_OR_NULL(bt_debugfs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) rfcomm_sock_debugfs = debugfs_create_file("rfcomm", 0444,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) bt_debugfs, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) &rfcomm_sock_debugfs_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) proto_unregister(&rfcomm_proto);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) void __exit rfcomm_cleanup_sockets(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) bt_procfs_cleanup(&init_net, "rfcomm");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) debugfs_remove(rfcomm_sock_debugfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) bt_sock_unregister(BTPROTO_RFCOMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) proto_unregister(&rfcomm_proto);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) }