Hi Johan, On Thu, Jun 07, 2012 at 02:58:38PM +0800, Johan Hedberg wrote: > From: Johan Hedberg <johan.hedberg@xxxxxxxxx> > > With LE/SMP the completion of a security level elavation from medium to > high is indicated by a HCI Encryption Key Refresh complete event. The > necessary behavior upon receiving this event is a mix of what's done for > auth_complete and encryption_change, which is also where most of the > event handling code has been copied from. > > Signed-off-by: Johan Hedberg <johan.hedberg@xxxxxxxxx> ... > +static void hci_key_refresh_complete_evt(struct hci_dev *hdev, > + struct sk_buff *skb) > +{ > + struct hci_ev_key_refresh_complete *ev = (void *) skb->data; > + struct hci_conn *conn; > + > + BT_DBG("%s status %u handle %u", hdev->name, ev->status, > + __le16_to_cpu(ev->handle)); > + > + hci_dev_lock(hdev); > + > + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); > + if (!conn) > + goto unlock; > + > + if (!ev->status) > + conn->sec_level = conn->pending_sec_level; > + > + clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); > + > + if (ev->status && conn->state == BT_CONNECTED) { > + hci_acl_disconn(conn, HCI_ERROR_AUTH_FAILURE); > + hci_conn_put(conn); > + goto unlock; > + } > + > + if (conn->state == BT_CONFIG) { > + if (!ev->status) > + conn->state = BT_CONNECTED; > + > + hci_proto_connect_cfm(conn, ev->status); > + hci_conn_put(conn); > + } else { > + hci_auth_cfm(conn, ev->status); > + > + hci_conn_hold(conn); If you want to keep extra hold(conn) you may just not put. Is this typo? > + conn->disc_timeout = HCI_DISCONN_TIMEOUT; > + hci_conn_put(conn); > + } Best regards Andrei Emeltchenko -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html