|
@@ -401,6 +401,11 @@ static inline void l2cap_send_rr_or_rnr(struct l2cap_pinfo *pi, u16 control)
|
|
|
l2cap_send_sframe(pi, control);
|
|
|
}
|
|
|
|
|
|
+static inline int __l2cap_no_conn_pending(struct sock *sk)
|
|
|
+{
|
|
|
+ return !(l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND);
|
|
|
+}
|
|
|
+
|
|
|
static void l2cap_do_start(struct sock *sk)
|
|
|
{
|
|
|
struct l2cap_conn *conn = l2cap_pi(sk)->conn;
|
|
@@ -409,12 +414,13 @@ static void l2cap_do_start(struct sock *sk)
|
|
|
if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
|
|
|
return;
|
|
|
|
|
|
- if (l2cap_check_security(sk)) {
|
|
|
+ if (l2cap_check_security(sk) && __l2cap_no_conn_pending(sk)) {
|
|
|
struct l2cap_conn_req req;
|
|
|
req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
|
|
|
req.psm = l2cap_pi(sk)->psm;
|
|
|
|
|
|
l2cap_pi(sk)->ident = l2cap_get_ident(conn);
|
|
|
+ l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND;
|
|
|
|
|
|
l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
|
|
|
L2CAP_CONN_REQ, sizeof(req), &req);
|
|
@@ -464,12 +470,14 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
|
|
|
}
|
|
|
|
|
|
if (sk->sk_state == BT_CONNECT) {
|
|
|
- if (l2cap_check_security(sk)) {
|
|
|
+ if (l2cap_check_security(sk) &&
|
|
|
+ __l2cap_no_conn_pending(sk)) {
|
|
|
struct l2cap_conn_req req;
|
|
|
req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
|
|
|
req.psm = l2cap_pi(sk)->psm;
|
|
|
|
|
|
l2cap_pi(sk)->ident = l2cap_get_ident(conn);
|
|
|
+ l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND;
|
|
|
|
|
|
l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
|
|
|
L2CAP_CONN_REQ, sizeof(req), &req);
|
|
@@ -2912,7 +2920,6 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd
|
|
|
l2cap_pi(sk)->ident = 0;
|
|
|
l2cap_pi(sk)->dcid = dcid;
|
|
|
l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT;
|
|
|
-
|
|
|
l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND;
|
|
|
|
|
|
l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
|
|
@@ -4404,6 +4411,7 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
|
|
|
req.psm = l2cap_pi(sk)->psm;
|
|
|
|
|
|
l2cap_pi(sk)->ident = l2cap_get_ident(conn);
|
|
|
+ l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND;
|
|
|
|
|
|
l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
|
|
|
L2CAP_CONN_REQ, sizeof(req), &req);
|