diff --git a/Makefile.am b/Makefile.am
index daa78d5..1e53fa9 100644
--- a/Makefile.am
+++ b/Makefile.am
src/profile.h src/profile.c \
src/device.h src/device.c src/attio.h \
src/dbus-common.c src/dbus-common.h \
- src/event.h src/event.c \
- src/oob.h src/oob.c src/eir.h src/eir.c \
+ src/event.h src/event.c src/eir.h src/eir.c \
src/mgmt.c src/mgmt.h
src_bluetoothd_LDADD = lib/libbluetooth-private.la @GLIB_LIBS@ @DBUS_LIBS@ \
-ldl -lrt
diff --git a/plugins/dbusoob.c b/plugins/dbusoob.c
index d3bca9e..ea40355 100644
--- a/plugins/dbusoob.c
+++ b/plugins/dbusoob.c
#include "dbus-common.h"
#include "event.h"
#include "error.h"
-#include "oob.h"
#include "storage.h"
#define OOB_INTERFACE "org.bluez.OutOfBand"
-struct oob_request {
- struct btd_adapter *adapter;
- DBusMessage *msg;
-};
-
struct oob_data {
char *addr;
uint8_t *hash;
const char *name;
};
-static GSList *oob_requests = NULL;
-
-static gint oob_request_cmp(gconstpointer a, gconstpointer b)
-{
- const struct oob_request *data = a;
- const struct btd_adapter *adapter = b;
-
- return data->adapter != adapter;
-}
-
-static struct oob_request *find_oob_request(struct btd_adapter *adapter)
-{
- GSList *match;
-
- match = g_slist_find_custom(oob_requests, adapter, oob_request_cmp);
-
- if (match)
- return match->data;
-
- return NULL;
-}
-
static void read_local_data_complete(struct btd_adapter *adapter, uint8_t *hash,
- uint8_t *randomizer)
+ uint8_t *randomizer, void *user_data)
{
struct DBusMessage *reply;
- struct oob_request *oob_request;
DBusMessageIter iter;
DBusMessageIter dict;
+ DBusMessage *msg = user_data;
- oob_request = find_oob_request(adapter);
- if (!oob_request)
- return;
+ DBG("");
if (!hash || !randomizer) {
- reply = btd_error_failed(oob_request->msg,
- "Failed to read local OOB data.");
+ reply = btd_error_failed(msg, "Failed to read local OOB data");
goto done;
}
- reply = dbus_message_new_method_return(oob_request->msg);
+ reply = dbus_message_new_method_return(msg);
if (!reply)
goto done;
dbus_message_iter_close_container(&iter, &dict);
done:
- oob_requests = g_slist_remove(oob_requests, oob_request);
- dbus_message_unref(oob_request->msg);
- g_free(oob_request);
+ dbus_message_unref(msg);
if (!reply) {
error("Couldn't allocate D-Bus message");
void *data)
{
struct btd_adapter *adapter = data;
- struct oob_request *oob_request;
+ struct oob_handler *handler;
if (!btd_adapter_ssp_enabled(adapter))
return btd_error_not_supported(msg);
- if (find_oob_request(adapter))
+ if (btd_adapter_check_oob_handler(adapter))
return btd_error_in_progress(msg);
if (btd_adapter_read_local_oob_data(adapter))
return btd_error_failed(msg, "Request failed.");
- oob_request = g_new(struct oob_request, 1);
- oob_request->adapter = adapter;
- oob_requests = g_slist_append(oob_requests, oob_request);
- oob_request->msg = dbus_message_ref(msg);
+ handler = g_new0(struct oob_handler, 1);
+ handler->read_local_cb = read_local_data_complete;
+ handler->user_data = dbus_message_ref(msg);
+
+ btd_adapter_set_oob_handler(adapter, handler);
return NULL;
}
static void oob_remove(struct btd_adapter *adapter)
{
- read_local_data_complete(adapter, NULL, NULL);
-
g_dbus_unregister_interface(btd_get_dbus_connection(),
adapter_get_path(adapter), OOB_INTERFACE);
}
{
DBG("Setup dbusoob plugin");
- oob_register_cb(read_local_data_complete);
-
return btd_register_adapter_driver(&oob_driver);
}
diff --git a/src/adapter.c b/src/adapter.c
index 0871a37..073c722 100644
--- a/src/adapter.c
+++ b/src/adapter.c
GSList *drivers;
GSList *profiles;
+
+ struct oob_handler *oob_handler;
};
static gboolean process_auth_queue(gpointer user_data);
return mgmt_cancel_bonding(adapter->dev_id, bdaddr);
}
+static void check_oob_bonding_complete(struct btd_adapter *adapter,
+ bdaddr_t *bdaddr, uint8_t status)
+{
+ if (!adapter->oob_handler || !adapter->oob_handler->bonding_cb)
+ return;
+
+ if (bacmp(bdaddr, &adapter->oob_handler->remote_addr) != 0)
+ return;
+
+ adapter->oob_handler->bonding_cb(adapter, bdaddr, status,
+ adapter->oob_handler->user_data);
+
+ g_free(adapter->oob_handler);
+ adapter->oob_handler = NULL;
+}
+
void adapter_bonding_complete(struct btd_adapter *adapter, bdaddr_t *bdaddr,
uint8_t status)
{
adapter->discov_suspended = FALSE;
mgmt_start_discovery(adapter->dev_id);
}
+
+ check_oob_bonding_complete(adapter, bdaddr, status);
}
int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
{
return mgmt_ssp_enabled(adapter->dev_id);
}
+
+void btd_adapter_set_oob_handler(struct btd_adapter *adapter,
+ struct oob_handler *handler)
+{
+ adapter->oob_handler = handler;
+}
+
+gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter)
+{
+ return adapter->oob_handler != NULL;
+}
+
+void adapter_read_local_oob_data_complete(struct btd_adapter *adapter,
+ uint8_t *hash, uint8_t *randomizer)
+{
+ if (!adapter->oob_handler || !adapter->oob_handler->read_local_cb)
+ return;
+
+ adapter->oob_handler->read_local_cb(adapter, hash, randomizer,
+ adapter->oob_handler->user_data);
+
+ g_free(adapter->oob_handler);
+ adapter->oob_handler = NULL;
+}
diff --git a/src/adapter.h b/src/adapter.h
index f41ca55..7ca8d95 100644
--- a/src/adapter.h
+++ b/src/adapter.h
struct btd_adapter;
+typedef void (*oob_read_local_cb_t) (struct btd_adapter *adapter,
+ uint8_t *hash, uint8_t *randomizer,
+ void *user_data);
+typedef void (*oob_bonding_cb_t) (struct btd_adapter *adapter,
+ bdaddr_t *bdaddr, uint8_t status,
+ void *user_data);
+
+struct oob_handler {
+ oob_read_local_cb_t read_local_cb;
+ oob_bonding_cb_t bonding_cb;
+ bdaddr_t remote_addr;
+ void *user_data;
+};
+
struct link_key_info {
bdaddr_t bdaddr;
unsigned char key[16];
uint8_t status);
int btd_adapter_read_local_oob_data(struct btd_adapter *adapter);
+void adapter_read_local_oob_data_complete(struct btd_adapter *adapter,
+ uint8_t *hash, uint8_t *randomizer);
int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
bdaddr_t *bdaddr, uint8_t *hash, uint8_t *randomizer);
struct btd_device *device);
void adapter_connect_list_remove(struct btd_adapter *adapter,
struct btd_device *device);
+
+void btd_adapter_set_oob_handler(struct btd_adapter *adapter,
+ struct oob_handler *handler);
+gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter);
diff --git a/src/mgmt.c b/src/mgmt.c
index d273b2b..b689be8 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
#include "manager.h"
#include "device.h"
#include "event.h"
-#include "oob.h"
#include "eir.h"
#include "mgmt.h"
DBG("hci%u", index);
adapter = manager_find_adapter_by_id(index);
-
if (adapter)
- oob_read_local_data_complete(adapter, rp->hash, rp->randomizer);
+ adapter_read_local_oob_data_complete(adapter, rp->hash,
+ rp->randomizer);
}
static void start_discovery_complete(int sk, uint16_t index, uint8_t status,
DBG("hci%u", index);
adapter = manager_find_adapter_by_id(index);
-
if (adapter)
- oob_read_local_data_complete(adapter, NULL, NULL);
+ adapter_read_local_oob_data_complete(adapter, NULL, NULL);
}
static void handle_pending_uuids(uint16_t index)
diff --git a/src/oob.c b/src/oob.c
deleted file mode 100644
index 75798fb..0000000
--- a/src/oob.c
+++ /dev/null
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2011 ST-Ericsson SA
- *
- * Author: Szymon Janc <szymon.janc@tieto.com> for ST-Ericsson
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include "adapter.h"
-#include "oob.h"
-
-static oob_read_cb_t local_oob_read_cb = NULL;
-
-void oob_register_cb(oob_read_cb_t cb)
-{
- local_oob_read_cb = cb;
-}
-
-void oob_read_local_data_complete(struct btd_adapter *adapter, uint8_t *hash,
- uint8_t *randomizer)
-{
- if (local_oob_read_cb)
- local_oob_read_cb(adapter, hash, randomizer);
-}
diff --git a/src/oob.h b/src/oob.h
deleted file mode 100644
index 5805082..0000000
--- a/src/oob.h
+++ /dev/null
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2011 ST-Ericsson SA
- *
- * Author: Szymon Janc <szymon.janc@tieto.com> for ST-Ericsson
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-typedef void (*oob_read_cb_t) (struct btd_adapter *adapter, uint8_t *hash,
- uint8_t *randomizer);
-
-void oob_register_cb(oob_read_cb_t cb);
-
-void oob_read_local_data_complete(struct btd_adapter *adapter, uint8_t *hash,
- uint8_t *randomizer);