diff options
Diffstat (limited to 'net/bluetooth/l2cap_core.c')
| -rw-r--r-- | net/bluetooth/l2cap_core.c | 21 | 
1 files changed, 15 insertions, 6 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index e64a1c2df23..56fdd9162da 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -4002,21 +4002,30 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)  			}  		} else if (sk->sk_state == BT_CONNECT2) {  			struct l2cap_conn_rsp rsp; -			__u16 result; +			__u16 res, stat;  			if (!status) { -				sk->sk_state = BT_CONFIG; -				result = L2CAP_CR_SUCCESS; +				if (bt_sk(sk)->defer_setup) { +					struct sock *parent = bt_sk(sk)->parent; +					res = L2CAP_CR_PEND; +					stat = L2CAP_CS_AUTHOR_PEND; +					parent->sk_data_ready(parent, 0); +				} else { +					sk->sk_state = BT_CONFIG; +					res = L2CAP_CR_SUCCESS; +					stat = L2CAP_CS_NO_INFO; +				}  			} else {  				sk->sk_state = BT_DISCONN;  				l2cap_sock_set_timer(sk, HZ / 10); -				result = L2CAP_CR_SEC_BLOCK; +				res = L2CAP_CR_SEC_BLOCK; +				stat = L2CAP_CS_NO_INFO;  			}  			rsp.scid   = cpu_to_le16(chan->dcid);  			rsp.dcid   = cpu_to_le16(chan->scid); -			rsp.result = cpu_to_le16(result); -			rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); +			rsp.result = cpu_to_le16(res); +			rsp.status = cpu_to_le16(stat);  			l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,  							sizeof(rsp), &rsp);  		}  |