diff options
-rw-r--r-- | net/bluetooth/hci_event.c | 91 |
1 files changed, 47 insertions, 44 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 84093b0000b9..84302768939a 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -1162,33 +1162,33 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff | |||
1162 | hci_dev_lock(hdev); | 1162 | hci_dev_lock(hdev); |
1163 | 1163 | ||
1164 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); | 1164 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); |
1165 | if (conn) { | 1165 | if (!conn) |
1166 | if (!ev->status) | 1166 | goto unlock; |
1167 | memcpy(conn->features, ev->features, 8); | ||
1168 | 1167 | ||
1169 | if (conn->state == BT_CONFIG) { | 1168 | if (!ev->status) |
1170 | if (!ev->status && lmp_ssp_capable(hdev) && | 1169 | memcpy(conn->features, ev->features, 8); |
1171 | lmp_ssp_capable(conn)) { | 1170 | |
1172 | struct hci_cp_read_remote_ext_features cp; | 1171 | if (conn->state != BT_CONFIG) |
1173 | cp.handle = ev->handle; | 1172 | goto unlock; |
1174 | cp.page = 0x01; | 1173 | |
1175 | hci_send_cmd(hdev, | 1174 | if (!ev->status && lmp_ssp_capable(hdev) && lmp_ssp_capable(conn)) { |
1176 | HCI_OP_READ_REMOTE_EXT_FEATURES, | 1175 | struct hci_cp_read_remote_ext_features cp; |
1177 | sizeof(cp), &cp); | 1176 | cp.handle = ev->handle; |
1178 | } else if (!ev->status && conn->out && | 1177 | cp.page = 0x01; |
1179 | conn->sec_level == BT_SECURITY_HIGH) { | 1178 | hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES, |
1180 | struct hci_cp_auth_requested cp; | ||
1181 | cp.handle = ev->handle; | ||
1182 | hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, | ||
1183 | sizeof(cp), &cp); | 1179 | sizeof(cp), &cp); |
1184 | } else { | 1180 | } else if (!ev->status && conn->out && |
1185 | conn->state = BT_CONNECTED; | 1181 | conn->sec_level == BT_SECURITY_HIGH) { |
1186 | hci_proto_connect_cfm(conn, ev->status); | 1182 | struct hci_cp_auth_requested cp; |
1187 | hci_conn_put(conn); | 1183 | cp.handle = ev->handle; |
1188 | } | 1184 | hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp); |
1189 | } | 1185 | } else { |
1186 | conn->state = BT_CONNECTED; | ||
1187 | hci_proto_connect_cfm(conn, ev->status); | ||
1188 | hci_conn_put(conn); | ||
1190 | } | 1189 | } |
1191 | 1190 | ||
1191 | unlock: | ||
1192 | hci_dev_unlock(hdev); | 1192 | hci_dev_unlock(hdev); |
1193 | } | 1193 | } |
1194 | 1194 | ||
@@ -1646,32 +1646,35 @@ static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_b | |||
1646 | hci_dev_lock(hdev); | 1646 | hci_dev_lock(hdev); |
1647 | 1647 | ||
1648 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); | 1648 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); |
1649 | if (conn) { | 1649 | if (!conn) |
1650 | if (!ev->status && ev->page == 0x01) { | 1650 | goto unlock; |
1651 | struct inquiry_entry *ie; | ||
1652 | 1651 | ||
1653 | if ((ie = hci_inquiry_cache_lookup(hdev, &conn->dst))) | 1652 | if (!ev->status && ev->page == 0x01) { |
1654 | ie->data.ssp_mode = (ev->features[0] & 0x01); | 1653 | struct inquiry_entry *ie; |
1655 | 1654 | ||
1656 | conn->ssp_mode = (ev->features[0] & 0x01); | 1655 | if ((ie = hci_inquiry_cache_lookup(hdev, &conn->dst))) |
1657 | } | 1656 | ie->data.ssp_mode = (ev->features[0] & 0x01); |
1658 | 1657 | ||
1659 | if (conn->state == BT_CONFIG) { | 1658 | conn->ssp_mode = (ev->features[0] & 0x01); |
1660 | if (!ev->status && hdev->ssp_mode > 0 && | 1659 | } |
1661 | conn->ssp_mode > 0 && conn->out && | 1660 | |
1662 | conn->sec_level != BT_SECURITY_SDP) { | 1661 | if (conn->state != BT_CONFIG) |
1663 | struct hci_cp_auth_requested cp; | 1662 | goto unlock; |
1664 | cp.handle = ev->handle; | 1663 | |
1665 | hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, | 1664 | if (!ev->status && hdev->ssp_mode > 0 && |
1666 | sizeof(cp), &cp); | 1665 | conn->ssp_mode > 0 && conn->out && |
1667 | } else { | 1666 | conn->sec_level != BT_SECURITY_SDP) { |
1668 | conn->state = BT_CONNECTED; | 1667 | struct hci_cp_auth_requested cp; |
1669 | hci_proto_connect_cfm(conn, ev->status); | 1668 | cp.handle = ev->handle; |
1670 | hci_conn_put(conn); | 1669 | hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, |
1671 | } | 1670 | sizeof(cp), &cp); |
1672 | } | 1671 | } else { |
1672 | conn->state = BT_CONNECTED; | ||
1673 | hci_proto_connect_cfm(conn, ev->status); | ||
1674 | hci_conn_put(conn); | ||
1673 | } | 1675 | } |
1674 | 1676 | ||
1677 | unlock: | ||
1675 | hci_dev_unlock(hdev); | 1678 | hci_dev_unlock(hdev); |
1676 | } | 1679 | } |
1677 | 1680 | ||