|
@@ -775,7 +775,7 @@ static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
|
|
|
}
|
|
|
|
|
|
/* Service level security */
|
|
|
-int l2cap_chan_check_security(struct l2cap_chan *chan)
|
|
|
+int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator)
|
|
|
{
|
|
|
struct l2cap_conn *conn = chan->conn;
|
|
|
__u8 auth_type;
|
|
@@ -785,7 +785,8 @@ int l2cap_chan_check_security(struct l2cap_chan *chan)
|
|
|
|
|
|
auth_type = l2cap_get_auth_type(chan);
|
|
|
|
|
|
- return hci_conn_security(conn->hcon, chan->sec_level, auth_type);
|
|
|
+ return hci_conn_security(conn->hcon, chan->sec_level, auth_type,
|
|
|
+ initiator);
|
|
|
}
|
|
|
|
|
|
static u8 l2cap_get_ident(struct l2cap_conn *conn)
|
|
@@ -1278,7 +1279,7 @@ static void l2cap_do_start(struct l2cap_chan *chan)
|
|
|
if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
|
|
|
return;
|
|
|
|
|
|
- if (l2cap_chan_check_security(chan) &&
|
|
|
+ if (l2cap_chan_check_security(chan, true) &&
|
|
|
__l2cap_no_conn_pending(chan)) {
|
|
|
l2cap_start_connection(chan);
|
|
|
}
|
|
@@ -1357,7 +1358,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
|
|
|
}
|
|
|
|
|
|
if (chan->state == BT_CONNECT) {
|
|
|
- if (!l2cap_chan_check_security(chan) ||
|
|
|
+ if (!l2cap_chan_check_security(chan, true) ||
|
|
|
!__l2cap_no_conn_pending(chan)) {
|
|
|
l2cap_chan_unlock(chan);
|
|
|
continue;
|
|
@@ -1379,7 +1380,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
|
|
|
rsp.scid = cpu_to_le16(chan->dcid);
|
|
|
rsp.dcid = cpu_to_le16(chan->scid);
|
|
|
|
|
|
- if (l2cap_chan_check_security(chan)) {
|
|
|
+ if (l2cap_chan_check_security(chan, false)) {
|
|
|
if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
|
|
|
rsp.result = cpu_to_le16(L2CAP_CR_PEND);
|
|
|
rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
|
|
@@ -3849,7 +3850,7 @@ static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
|
|
|
chan->ident = cmd->ident;
|
|
|
|
|
|
if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
|
|
|
- if (l2cap_chan_check_security(chan)) {
|
|
|
+ if (l2cap_chan_check_security(chan, false)) {
|
|
|
if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
|
|
|
l2cap_state_change(chan, BT_CONNECT2);
|
|
|
result = L2CAP_CR_PEND;
|
|
@@ -7191,7 +7192,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
|
|
|
if (hcon->state == BT_CONNECTED) {
|
|
|
if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
|
|
|
__clear_chan_timer(chan);
|
|
|
- if (l2cap_chan_check_security(chan))
|
|
|
+ if (l2cap_chan_check_security(chan, true))
|
|
|
l2cap_state_change(chan, BT_CONNECTED);
|
|
|
} else
|
|
|
l2cap_do_start(chan);
|