Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c4f912e1 authored by Marcel Holtmann's avatar Marcel Holtmann
Browse files

Bluetooth: Add global deferred socket parameter



The L2CAP and RFCOMM applications require support for authorization
and the ability of rejecting incoming connection requests. The socket
interface is not really able to support this.

This patch does the ground work for a socket option to defer connection
setup. Setting this option allows calling of accept() and then the
first read() will trigger the final connection setup. Calling close()
would reject the connection.

Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent d58daf42
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -53,6 +53,8 @@
#define SOL_SCO		17
#define SOL_RFCOMM	18

#define BT_DEFER_SETUP	7

#define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg)
#define BT_ERR(fmt, arg...)  printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg)
#define BT_DBG(fmt, arg...)  pr_debug("%s: " fmt "\n" , __func__ , ## arg)
@@ -108,6 +110,7 @@ struct bt_sock {
	bdaddr_t    dst;
	struct list_head accept_q;
	struct sock *parent;
	u32 defer_setup;
};

struct bt_sock_list {
+6 −2
Original line number Diff line number Diff line
@@ -217,7 +217,8 @@ struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock)
			continue;
		}

		if (sk->sk_state == BT_CONNECTED || !newsock) {
		if (sk->sk_state == BT_CONNECTED || !newsock ||
						bt_sk(parent)->defer_setup) {
			bt_accept_unlink(sk);
			if (newsock)
				sock_graft(sk, newsock);
@@ -275,6 +276,9 @@ static inline unsigned int bt_accept_poll(struct sock *parent)
	struct list_head *p, *n;
	struct sock *sk;

	if (bt_sk(parent)->defer_setup)
		return POLLIN | POLLRDNORM;

	list_for_each_safe(p, n, &bt_sk(parent)->accept_q) {
		sk = (struct sock *) list_entry(p, struct bt_sock, accept_q);
		if (sk->sk_state == BT_CONNECTED)