static int l2cap_disconn_ind(struct hci_conn *hcon, __u8 reason) { BT_DBG("hcon %p reason %d", hcon, reason); if (hcon->type != ACL_LINK) return 0; l2cap_conn_del(hcon, bterr(reason)); return 0; }
void smp_timeout(unsigned long arg) { struct l2cap_conn *conn = (void *) arg; u8 reason = SMP_UNSPECIFIED; BT_DBG("%p", conn); smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason), &reason); clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->hcon->pend); mgmt_auth_failed(conn->hcon->hdev->id, conn->dst, SMP_UNSPECIFIED); hci_conn_put(conn->hcon); //delete the l2cap connection l2cap_conn_del(conn->hcon, EACCES, 0); }
int le_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, void *cp) { struct mgmt_cp_user_passkey_reply *psk_reply = cp; struct l2cap_conn *conn = hcon->smp_conn; u8 key[16]; u8 reason = 0; int ret = 0; BT_DBG(""); hcon->tk_valid = TRUE; switch (mgmt_op) { case MGMT_OP_USER_CONFIRM_NEG_REPLY: reason = SMP_CONFIRM_FAILED; break; case MGMT_OP_USER_CONFIRM_REPLY: break; case MGMT_OP_USER_PASSKEY_REPLY: memset(key, 0, sizeof(key)); BT_DBG("PassKey: %d", psk_reply->passkey); put_unaligned_le32(psk_reply->passkey, key); swap128(key, hcon->tk); break; default: reason = SMP_CONFIRM_FAILED; ret = -EOPNOTSUPP; break; } if (reason) { BT_DBG("smp_send_cmd: SMP_CMD_PAIRING_FAIL"); smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason), &reason); del_timer(&hcon->smp_timer); if (hcon->disconn_cfm_cb) hcon->disconn_cfm_cb(hcon, SMP_UNSPECIFIED); clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->pend); mgmt_auth_failed(hcon->hdev->id, conn->dst, reason); hci_conn_put(hcon); l2cap_conn_del(hcon, EACCES, 0); } else if (hcon->cfm_pending) { BT_DBG("send_pairing_confirm"); ret = send_pairing_confirm(conn); } return ret; }
static int l2cap_connect_cfm(struct hci_conn *hcon, __u8 status) { BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status); if (hcon->type != ACL_LINK) return 0; if (!status) { struct l2cap_conn *conn; conn = l2cap_conn_add(hcon, status); if (conn) l2cap_conn_ready(conn); } else l2cap_conn_del(hcon, bterr(status)); return 0; }