diff options
author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2006-08-25 14:03:52 +0000 |
---|---|---|
committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2006-08-25 14:03:52 +0000 |
commit | 10dcd5fa6f6978b1ea76f370e87dc3f14e46ac0c (patch) | |
tree | 5ead42eaf538e7e6a98c6c314af26f1e3a6956fc /hcid/dbus-adapter.c | |
parent | dbe289f011a9ecedf0f4cabb9f25c9564c8aa830 (diff) |
Reduced CancelBonding reply time
Diffstat (limited to 'hcid/dbus-adapter.c')
-rw-r--r-- | hcid/dbus-adapter.c | 57 |
1 files changed, 38 insertions, 19 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c index 07583d77..749dad6f 100644 --- a/hcid/dbus-adapter.c +++ b/hcid/dbus-adapter.c @@ -1792,7 +1792,8 @@ static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBu static DBusHandlerResult handle_dev_cancel_bonding_req(DBusConnection *conn, DBusMessage *msg, void *data) { struct hci_dbus_data *dbus_data = data; - struct slist *l; + struct slist *la; + DBusMessage *reply; DBusError err; bdaddr_t peer_bdaddr; const char *peer_addr; @@ -1830,11 +1831,11 @@ static DBusHandlerResult handle_dev_cancel_bonding_req(DBusConnection *conn, DBu if (dd < 0) return error_no_such_adapter(conn, msg); - dbus_data->bonding->cancel = dbus_message_ref(msg); + dbus_data->bonding->cancel = 1; - l = slist_find(dbus_data->active_conn, &peer_bdaddr, active_conn_find_by_bdaddr); + la = slist_find(dbus_data->active_conn, &peer_bdaddr, active_conn_find_by_bdaddr); - if (!l) { + if (!la) { /* connection request is pending */ struct hci_request rq; create_conn_cancel_cp cp; @@ -1874,26 +1875,44 @@ static DBusHandlerResult handle_dev_cancel_bonding_req(DBusConnection *conn, DBu */ } else { - struct active_conn_info *cinfo = l->data; - - /* for unlock PIN Code Request */ - hci_send_cmd(dd, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, 6, &peer_bdaddr); + struct slist *lb; + struct active_conn_info *cinfo = la->data; /* - * Disconnect from the remote device for safety, maybe the - * Controller already received the reply for PIN Code Request - */ - if (dbus_data->bonding->disconnect) { - if (hci_disconnect(dd, htobs(cinfo->handle), HCI_AUTHENTICATION_FAILURE, 1000) < 0) - error("Disconnect failed"); + * It is already connected, search in the pending passkey requests to + * figure out the current stage(waiting host passkey/remote passkey) + */ + lb = slist_find(dbus_data->pending_bondings, &peer_bdaddr, pending_bonding_cmp); + if (lb) { + struct pending_bonding_info *pb = lb->data; + /* 0: waiting host passkey 1: waiting remote passkey */ + if (pb->step) { + if (dbus_data->bonding->disconnect) { + + /* disconnect and let disconnect handler reply create bonding */ + if (hci_disconnect(dd, htobs(cinfo->handle), HCI_AUTHENTICATION_FAILURE, 1000) < 0) + error("Disconnect failed"); + } else { + /* + * If disconnect can't be applied and the PIN Code Request + * was already replied it doesn't make sense cancel the + * remote passkey: return not authorized. + */ + + error_not_authorized(conn, msg); + goto failed; + } + } else { + + /* for unlock PIN Code Request */ + hci_send_cmd(dd, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, 6, &peer_bdaddr); + } } - - /* - * If disconnect can't be applied and the PIN Code Request - * was already replied let the Controller's timer to expire - */ } + reply = dbus_message_new_method_return(msg); + send_reply_and_unref(conn, reply); +failed: hci_close_dev(dd); return DBUS_HANDLER_RESULT_HANDLED; |