Commit bdc25783 authored by Marcel Holtmann's avatar Marcel Holtmann Committed by Johan Hedberg

Bluetooth: Introduce L2CAP channel flag for defer setup

The L2CAP core should not look into the socket flags to figure out the
setting of defer setup. So introduce a L2CAP channel flag that mirrors
the socket flag.

Since the defer setup option is only set in one place this becomes a
really easy thing to do.
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
parent c5605755
...@@ -652,6 +652,7 @@ enum { ...@@ -652,6 +652,7 @@ enum {
FLAG_FLUSHABLE, FLAG_FLUSHABLE,
FLAG_EXT_CTRL, FLAG_EXT_CTRL,
FLAG_EFS_ENABLE, FLAG_EFS_ENABLE,
FLAG_DEFER_SETUP,
}; };
enum { enum {
......
...@@ -655,14 +655,14 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason) ...@@ -655,14 +655,14 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason)
case BT_CONNECT2: case BT_CONNECT2:
if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED &&
conn->hcon->type == ACL_LINK) { conn->hcon->type == ACL_LINK) {
struct sock *sk = chan->sk;
struct l2cap_conn_rsp rsp; struct l2cap_conn_rsp rsp;
__u16 result; __u16 result;
if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
result = L2CAP_CR_SEC_BLOCK; result = L2CAP_CR_SEC_BLOCK;
else else
result = L2CAP_CR_BAD_PSM; result = L2CAP_CR_BAD_PSM;
l2cap_state_change(chan, BT_DISCONN); l2cap_state_change(chan, BT_DISCONN);
rsp.scid = cpu_to_le16(chan->dcid); rsp.scid = cpu_to_le16(chan->dcid);
...@@ -1294,16 +1294,16 @@ static void l2cap_conn_start(struct l2cap_conn *conn) ...@@ -1294,16 +1294,16 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
l2cap_start_connection(chan); l2cap_start_connection(chan);
} else if (chan->state == BT_CONNECT2) { } else if (chan->state == BT_CONNECT2) {
struct sock *sk = chan->sk;
struct l2cap_conn_rsp rsp; struct l2cap_conn_rsp rsp;
char buf[128]; char buf[128];
rsp.scid = cpu_to_le16(chan->dcid); rsp.scid = cpu_to_le16(chan->dcid);
rsp.dcid = cpu_to_le16(chan->scid); rsp.dcid = cpu_to_le16(chan->scid);
if (l2cap_chan_check_security(chan)) { if (l2cap_chan_check_security(chan)) {
struct sock *sk = chan->sk;
lock_sock(sk); lock_sock(sk);
if (test_bit(BT_SK_DEFER_SETUP, if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
&bt_sk(sk)->flags)) {
rsp.result = __constant_cpu_to_le16(L2CAP_CR_PEND); rsp.result = __constant_cpu_to_le16(L2CAP_CR_PEND);
rsp.status = __constant_cpu_to_le16(L2CAP_CS_AUTHOR_PEND); rsp.status = __constant_cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
chan->ops->defer(chan); chan->ops->defer(chan);
...@@ -3823,7 +3823,7 @@ static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn, ...@@ -3823,7 +3823,7 @@ static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) { if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
if (l2cap_chan_check_security(chan)) { if (l2cap_chan_check_security(chan)) {
if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
__l2cap_state_change(chan, BT_CONNECT2); __l2cap_state_change(chan, BT_CONNECT2);
result = L2CAP_CR_PEND; result = L2CAP_CR_PEND;
status = L2CAP_CS_AUTHOR_PEND; status = L2CAP_CS_AUTHOR_PEND;
...@@ -6693,8 +6693,7 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) ...@@ -6693,8 +6693,7 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
lock_sock(sk); lock_sock(sk);
if (!status) { if (!status) {
if (test_bit(BT_SK_DEFER_SETUP, if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
&bt_sk(sk)->flags)) {
res = L2CAP_CR_PEND; res = L2CAP_CR_PEND;
stat = L2CAP_CS_AUTHOR_PEND; stat = L2CAP_CS_AUTHOR_PEND;
chan->ops->defer(chan); chan->ops->defer(chan);
......
...@@ -672,10 +672,13 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ...@@ -672,10 +672,13 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
break; break;
} }
if (opt) if (opt) {
set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
else set_bit(FLAG_DEFER_SETUP, &chan->flags);
} else {
clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
clear_bit(FLAG_DEFER_SETUP, &chan->flags);
}
break; break;
case BT_FLUSHABLE: case BT_FLUSHABLE:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment