Diff between 5e318d38bfae56f07474d61f4309e4949f490f8e and ea1ed8ec4486e6650d69c69714aeb6a6dcd8783a

Changed Files

File Additions Deletions Status
Makefile.am +2 -5 modified
src/adapter.c +47 -114 modified
src/adapter.h +0 -49 modified
src/main.c +7 -2 modified
src/mgmt.c +34 -83 renamed
src/mgmt.h +80 -0 added

Full Patch

diff --git a/Makefile.am b/Makefile.am
index 8afb2cc..009762d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -244,10 +244,6 @@ builtin_sources += profiles/thermometer/main.c \
 			profiles/deviceinfo/deviceinfo.c
 endif
 
-
-builtin_modules += mgmtops
-builtin_sources += plugins/mgmtops.c
-
 if HAL
 builtin_modules += hal
 builtin_sources += plugins/hal.c
@@ -311,7 +307,8 @@ src_bluetoothd_SOURCES = $(gdbus_sources) $(builtin_sources) \
 			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/oob.h src/oob.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
 src_bluetoothd_LDFLAGS = $(AM_LDFLAGS) -Wl,--export-dynamic \
diff --git a/src/adapter.c b/src/adapter.c
index 505797f..8820e27 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -60,6 +60,7 @@
 #include "gatt.h"
 #include "attrib-server.h"
 #include "eir.h"
+#include "mgmt.h"
 
 /* Flags Descriptions */
 #define EIR_LIM_DISC                0x01 /* LE Limited Discoverable Mode */
@@ -84,10 +85,6 @@
 static DBusConnection *connection = NULL;
 static GSList *adapter_drivers = NULL;
 
-static GSList *ops_candidates = NULL;
-
-const struct btd_adapter_ops *adapter_ops = NULL;
-
 struct session_req {
 	struct btd_adapter	*adapter;
 	DBusConnection		*conn;		/* Connection reference */
@@ -170,7 +167,7 @@ static void dev_info_free(void *data)
 int btd_adapter_set_class(struct btd_adapter *adapter, uint8_t major,
 							uint8_t minor)
 {
-       return adapter_ops->set_dev_class(adapter->dev_id, major, minor);
+       return mgmt_set_dev_class(adapter->dev_id, major, minor);
 }
 
 static const char *mode2str(uint8_t mode)
@@ -246,9 +243,9 @@ static int adapter_set_mode(struct btd_adapter *adapter, uint8_t mode)
 	int err;
 
 	if (mode == MODE_CONNECTABLE)
-		err = adapter_ops->set_discoverable(adapter->dev_id, FALSE, 0);
+		err = mgmt_set_discoverable(adapter->dev_id, FALSE, 0);
 	else
-		err = adapter_ops->set_discoverable(adapter->dev_id, TRUE,
+		err = mgmt_set_discoverable(adapter->dev_id, TRUE,
 						adapter->discov_timeout);
 
 	return err;
@@ -276,7 +273,7 @@ static int set_mode(struct btd_adapter *adapter, uint8_t new_mode,
 		return -EALREADY;
 
 	if (!adapter->up && new_mode != MODE_OFF) {
-		err = adapter_ops->set_powered(adapter->dev_id, TRUE);
+		err = mgmt_set_powered(adapter->dev_id, TRUE);
 		if (err < 0)
 			return err;
 
@@ -284,7 +281,7 @@ static int set_mode(struct btd_adapter *adapter, uint8_t new_mode,
 	}
 
 	if (adapter->up && new_mode == MODE_OFF) {
-		err = adapter_ops->set_powered(adapter->dev_id, FALSE);
+		err = mgmt_set_powered(adapter->dev_id, FALSE);
 		if (err < 0)
 			return err;
 
@@ -393,7 +390,7 @@ static DBusMessage *set_pairable(DBusConnection *conn, DBusMessage *msg,
 		return btd_error_failed(msg, strerror(-err));
 
 store:
-	adapter_ops->set_pairable(adapter->dev_id, pairable);
+	mgmt_set_pairable(adapter->dev_id, pairable);
 
 done:
 	return msg ? dbus_message_new_method_return(msg) : NULL;
@@ -510,7 +507,7 @@ static void stop_discovery(struct btd_adapter *adapter)
 	}
 
 	if (adapter->up)
-		adapter_ops->stop_discovery(adapter->dev_id);
+		mgmt_stop_discovery(adapter->dev_id);
 }
 
 static void session_remove(struct session_req *req)
@@ -645,7 +642,7 @@ static DBusMessage *set_discoverable_timeout(DBusConnection *conn,
 		return dbus_message_new_method_return(msg);
 
 	if (adapter->scan_mode & SCAN_INQUIRY)
-		adapter_ops->set_discoverable(adapter->dev_id, TRUE, timeout);
+		mgmt_set_discoverable(adapter->dev_id, TRUE, timeout);
 
 	adapter->discov_timeout = timeout;
 
@@ -743,7 +740,7 @@ int adapter_set_name(struct btd_adapter *adapter, const char *name)
 	}
 
 	if (adapter->up) {
-		int err = adapter_ops->set_name(adapter->dev_id, maxname);
+		int err = mgmt_set_name(adapter->dev_id, maxname);
 		if (err < 0)
 			return err;
 	} else {
@@ -906,7 +903,7 @@ void adapter_service_insert(struct btd_adapter *adapter, void *r)
 
 	if (new_uuid) {
 		uint8_t svc_hint = get_uuid_mask(&rec->svclass);
-		adapter_ops->add_uuid(adapter->dev_id, &rec->svclass, svc_hint);
+		mgmt_add_uuid(adapter->dev_id, &rec->svclass, svc_hint);
 	}
 
 	adapter_emit_uuids_updated(adapter);
@@ -919,7 +916,7 @@ void adapter_service_remove(struct btd_adapter *adapter, void *r)
 	adapter->services = sdp_list_remove(adapter->services, rec);
 
 	if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
-		adapter_ops->remove_uuid(adapter->dev_id, &rec->svclass);
+		mgmt_remove_uuid(adapter->dev_id, &rec->svclass);
 
 	adapter_emit_uuids_updated(adapter);
 }
@@ -1004,7 +1001,7 @@ static gboolean discovery_cb(gpointer user_data)
 
 	adapter->discov_id = 0;
 
-	err = adapter_ops->start_discovery(adapter->dev_id);
+	err = mgmt_start_discovery(adapter->dev_id);
 	if (err < 0)
 		error("start_discovery: %s (%d)", strerror(-err), -err);
 
@@ -1040,7 +1037,7 @@ static DBusMessage *adapter_start_discovery(DBusConnection *conn,
 	if (adapter->discov_suspended)
 		goto done;
 
-	err = adapter_ops->start_discovery(adapter->dev_id);
+	err = mgmt_start_discovery(adapter->dev_id);
 	if (err < 0)
 		return btd_error_failed(msg, strerror(-err));
 
@@ -1558,8 +1555,7 @@ static DBusMessage *find_device(DBusConnection *conn, DBusMessage *msg,
 
 static void agent_removed(struct agent *agent, struct btd_adapter *adapter)
 {
-	adapter_ops->set_io_capability(adapter->dev_id,
-					IO_CAPABILITY_NOINPUTNOOUTPUT);
+	mgmt_set_io_capability(adapter->dev_id, IO_CAPABILITY_NOINPUTNOOUTPUT);
 
 	adapter->agent = NULL;
 }
@@ -1590,7 +1586,7 @@ static DBusMessage *register_agent(DBusConnection *conn, DBusMessage *msg,
 	DBG("Agent registered for hci%d at %s:%s", adapter->dev_id, name,
 			path);
 
-	adapter_ops->set_io_capability(adapter->dev_id, cap);
+	mgmt_set_io_capability(adapter->dev_id, cap);
 
 	return dbus_message_new_method_return(msg);
 }
@@ -1967,10 +1963,10 @@ static void load_devices(struct btd_adapter *adapter)
 	create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "linkkeys");
 	textfile_foreach(filename, create_stored_device_from_linkkeys, &keys);
 
-	err = adapter_ops->load_keys(adapter->dev_id, keys.keys,
+	err = mgmt_load_link_keys(adapter->dev_id, keys.keys,
 							main_opts.debug_keys);
 	if (err < 0)
-		error("Unable to load keys to adapter_ops: %s (%d)",
+		error("Unable to load link keys: %s (%d)",
 							strerror(-err), -err);
 
 	g_slist_free_full(keys.keys, g_free);
@@ -1979,10 +1975,10 @@ static void load_devices(struct btd_adapter *adapter)
 	create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "longtermkeys");
 	textfile_foreach(filename, create_stored_device_from_ltks, &keys);
 
-	err = adapter_ops->load_ltks(adapter->dev_id, keys.keys);
+	err = mgmt_load_ltks(adapter->dev_id, keys.keys);
 	if (err < 0)
-		error("Unable to load keys to adapter_ops: %s (%d)",
-							strerror(-err), -err);
+		error("Unable to load ltks: %s (%d)", strerror(-err), -err);
+
 	g_slist_free_full(keys.keys, smp_key_free);
 	keys.keys = NULL;
 
@@ -1993,13 +1989,13 @@ static void load_devices(struct btd_adapter *adapter)
 int btd_adapter_block_address(struct btd_adapter *adapter, bdaddr_t *bdaddr,
 							uint8_t bdaddr_type)
 {
-	return adapter_ops->block_device(adapter->dev_id, bdaddr, bdaddr_type);
+	return mgmt_block_device(adapter->dev_id, bdaddr, bdaddr_type);
 }
 
 int btd_adapter_unblock_address(struct btd_adapter *adapter, bdaddr_t *bdaddr,
 							uint8_t bdaddr_type)
 {
-	return adapter_ops->unblock_device(adapter->dev_id, bdaddr,
+	return mgmt_unblock_device(adapter->dev_id, bdaddr,
 								bdaddr_type);
 }
 
@@ -2007,7 +2003,7 @@ static void clear_blocked(struct btd_adapter *adapter)
 {
 	int err;
 
-	err = adapter_ops->unblock_device(adapter->dev_id, BDADDR_ANY, 0);
+	err = mgmt_unblock_device(adapter->dev_id, BDADDR_ANY, 0);
 	if (err < 0)
 		error("Clearing blocked list failed: %s (%d)",
 						strerror(-err), -err);
@@ -2044,7 +2040,7 @@ static void load_connections(struct btd_adapter *adapter)
 	GSList *l, *conns;
 	int err;
 
-	err = adapter_ops->get_conn_list(adapter->dev_id, &conns);
+	err = mgmt_get_conn_list(adapter->dev_id, &conns);
 	if (err < 0) {
 		error("Unable to fetch existing connections: %s (%d)",
 							strerror(-err), -err);
@@ -2394,7 +2390,7 @@ gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
 
 	adapter->allow_name_changes = TRUE;
 
-	adapter_ops->read_bdaddr(adapter->dev_id, &adapter->bdaddr);
+	mgmt_read_bdaddr(adapter->dev_id, &adapter->bdaddr);
 
 	if (bacmp(&adapter->bdaddr, BDADDR_ANY) == 0) {
 		error("No address available for hci%d", adapter->dev_id);
@@ -2472,7 +2468,7 @@ void adapter_remove(struct btd_adapter *adapter)
 
 	/* Return adapter to down state if it was not up on init */
 	if (!adapter->already_up && adapter->up)
-		adapter_ops->set_powered(adapter->dev_id, FALSE);
+		mgmt_set_powered(adapter->dev_id, FALSE);
 }
 
 uint16_t adapter_get_dev_id(struct btd_adapter *adapter)
@@ -2544,7 +2540,7 @@ static void suspend_discovery(struct btd_adapter *adapter)
 		g_source_remove(adapter->discov_id);
 		adapter->discov_id = 0;
 	} else
-		adapter_ops->stop_discovery(adapter->dev_id);
+		mgmt_stop_discovery(adapter->dev_id);
 }
 
 static int found_device_cmp(gconstpointer a, gconstpointer b)
@@ -2889,7 +2885,7 @@ void adapter_update_found_devices(struct btd_adapter *adapter,
 	}
 
 	if (confirm_name)
-		adapter_ops->confirm_name(adapter->dev_id, bdaddr, bdaddr_type,
+		mgmt_confirm_name(adapter->dev_id, bdaddr, bdaddr_type,
 								name_known);
 
 	alias = read_stored_data(&adapter->bdaddr, bdaddr, "aliases");
@@ -3223,9 +3219,6 @@ int btd_adapter_restore_powered(struct btd_adapter *adapter)
 {
 	char mode[14], address[18];
 
-	if (!adapter_ops)
-		return -EINVAL;
-
 	if (!main_opts.remember_powered)
 		return -EINVAL;
 
@@ -3237,14 +3230,14 @@ int btd_adapter_restore_powered(struct btd_adapter *adapter)
 						g_str_equal(mode, "off"))
 		return 0;
 
-	return adapter_ops->set_powered(adapter->dev_id, TRUE);
+	return mgmt_set_powered(adapter->dev_id, TRUE);
 }
 
 static gboolean switch_off_timeout(gpointer user_data)
 {
 	struct btd_adapter *adapter = user_data;
 
-	adapter_ops->set_powered(adapter->dev_id, FALSE);
+	mgmt_set_powered(adapter->dev_id, FALSE);
 	adapter->off_timer = 0;
 
 	return FALSE;
@@ -3252,23 +3245,17 @@ static gboolean switch_off_timeout(gpointer user_data)
 
 int btd_adapter_switch_online(struct btd_adapter *adapter)
 {
-	if (!adapter_ops)
-		return -EINVAL;
-
 	if (adapter->up)
 		return -EALREADY;
 
 	if (adapter->off_timer)
 		off_timer_remove(adapter);
 
-	return adapter_ops->set_powered(adapter->dev_id, TRUE);
+	return mgmt_set_powered(adapter->dev_id, TRUE);
 }
 
 int btd_adapter_switch_offline(struct btd_adapter *adapter)
 {
-	if (!adapter_ops)
-		return -EINVAL;
-
 	if (!adapter->up)
 		return -EALREADY;
 
@@ -3278,7 +3265,7 @@ int btd_adapter_switch_offline(struct btd_adapter *adapter)
 	adapter->global_mode = MODE_OFF;
 
 	if (adapter->connections == NULL)
-		return adapter_ops->set_powered(adapter->dev_id, FALSE);
+		return mgmt_set_powered(adapter->dev_id, FALSE);
 
 	g_slist_foreach(adapter->connections,
 				(GFunc) device_request_disconnect, NULL);
@@ -3361,50 +3348,6 @@ ssize_t btd_adapter_get_pin(struct btd_adapter *adapter, struct btd_device *dev,
 	return read_pin_code(&sba, &dba, pin_buf);
 }
 
-int btd_register_adapter_ops(struct btd_adapter_ops *ops, gboolean priority)
-{
-	if (ops->setup == NULL)
-		return -EINVAL;
-
-	if (priority)
-		ops_candidates = g_slist_prepend(ops_candidates, ops);
-	else
-		ops_candidates = g_slist_append(ops_candidates, ops);
-
-	return 0;
-}
-
-void btd_adapter_cleanup_ops(struct btd_adapter_ops *ops)
-{
-	ops_candidates = g_slist_remove(ops_candidates, ops);
-	ops->cleanup();
-
-	if (adapter_ops == ops)
-		adapter_ops = NULL;
-}
-
-int adapter_ops_setup(void)
-{
-	GSList *l;
-	int ret;
-
-	if (!ops_candidates)
-		return -EINVAL;
-
-	for (l = ops_candidates; l != NULL; l = g_slist_next(l)) {
-		struct btd_adapter_ops *ops = l->data;
-
-		ret = ops->setup();
-		if (ret < 0)
-			continue;
-
-		adapter_ops = ops;
-		break;
-	}
-
-	return ret;
-}
-
 void btd_adapter_register_powered_callback(struct btd_adapter *adapter,
 						btd_adapter_powered_cb cb)
 {
@@ -3422,26 +3365,20 @@ void btd_adapter_unregister_powered_callback(struct btd_adapter *adapter,
 int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
 							gboolean enable)
 {
-	if (!adapter_ops)
-		return -EINVAL;
-
 	if (!adapter->up)
 		return -EINVAL;
 
-	return adapter_ops->set_fast_connectable(adapter->dev_id, enable);
+	return mgmt_set_fast_connectable(adapter->dev_id, enable);
 }
 
 int btd_adapter_read_clock(struct btd_adapter *adapter, bdaddr_t *bdaddr,
 				int which, int timeout, uint32_t *clock,
 				uint16_t *accuracy)
 {
-	if (!adapter_ops)
-		return -EINVAL;
-
 	if (!adapter->up)
 		return -EINVAL;
 
-	return adapter_ops->read_clock(adapter->dev_id, bdaddr, which,
+	return mgmt_read_clock(adapter->dev_id, bdaddr, which,
 						timeout, clock, accuracy);
 }
 
@@ -3449,34 +3386,32 @@ int btd_adapter_disconnect_device(struct btd_adapter *adapter,
 					bdaddr_t *bdaddr, uint8_t bdaddr_type)
 
 {
-	return adapter_ops->disconnect(adapter->dev_id, bdaddr, bdaddr_type);
+	return mgmt_disconnect(adapter->dev_id, bdaddr, bdaddr_type);
 }
 
 int btd_adapter_remove_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr,
 							uint8_t bdaddr_type)
 {
-	return adapter_ops->remove_bonding(adapter->dev_id, bdaddr,
-								bdaddr_type);
+	return mgmt_unpair_device(adapter->dev_id, bdaddr, bdaddr_type);
 }
 
 int btd_adapter_pincode_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
 					const char *pin, size_t pin_len)
 {
-	return adapter_ops->pincode_reply(adapter->dev_id, bdaddr, pin,
-								pin_len);
+	return mgmt_pincode_reply(adapter->dev_id, bdaddr, pin, pin_len);
 }
 
 int btd_adapter_confirm_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
 					uint8_t bdaddr_type, gboolean success)
 {
-	return adapter_ops->confirm_reply(adapter->dev_id, bdaddr, bdaddr_type,
+	return mgmt_confirm_reply(adapter->dev_id, bdaddr, bdaddr_type,
 								success);
 }
 
 int btd_adapter_passkey_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
 					uint8_t bdaddr_type, uint32_t passkey)
 {
-	return adapter_ops->passkey_reply(adapter->dev_id, bdaddr, bdaddr_type,
+	return mgmt_passkey_reply(adapter->dev_id, bdaddr, bdaddr_type,
 								passkey);
 }
 
@@ -3484,21 +3419,19 @@ int btd_adapter_set_did(struct btd_adapter *adapter, uint16_t vendor,
 					uint16_t product, uint16_t version,
 					uint16_t source)
 {
-	return adapter_ops->set_did(adapter->dev_id, vendor, product, version,
-								source);
+	return mgmt_set_did(adapter->dev_id, vendor, product, version, source);
 }
 
 int adapter_create_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr,
 					uint8_t addr_type, uint8_t io_cap)
 {
 	suspend_discovery(adapter);
-	return adapter_ops->create_bonding(adapter->dev_id, bdaddr,
-						addr_type, io_cap);
+	return mgmt_create_bonding(adapter->dev_id, bdaddr, addr_type, io_cap);
 }
 
 int adapter_cancel_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr)
 {
-	return adapter_ops->cancel_bonding(adapter->dev_id, bdaddr);
+	return mgmt_cancel_bonding(adapter->dev_id, bdaddr);
 }
 
 void adapter_bonding_complete(struct btd_adapter *adapter, bdaddr_t *bdaddr,
@@ -3518,24 +3451,24 @@ void adapter_bonding_complete(struct btd_adapter *adapter, bdaddr_t *bdaddr,
 
 	if (adapter->discov_suspended) {
 		adapter->discov_suspended = FALSE;
-		adapter_ops->start_discovery(adapter->dev_id);
+		mgmt_start_discovery(adapter->dev_id);
 	}
 }
 
 int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
 {
-	return adapter_ops->read_local_oob_data(adapter->dev_id);
+	return mgmt_read_local_oob_data(adapter->dev_id);
 }
 
 int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
 			bdaddr_t *bdaddr, uint8_t *hash, uint8_t *randomizer)
 {
-	return adapter_ops->add_remote_oob_data(adapter->dev_id, bdaddr, hash,
+	return mgmt_add_remote_oob_data(adapter->dev_id, bdaddr, hash,
 								randomizer);
 }
 
 int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
 							bdaddr_t *bdaddr)
 {
-	return adapter_ops->remove_remote_oob_data(adapter->dev_id, bdaddr);
+	return mgmt_remove_remote_oob_data(adapter->dev_id, bdaddr);
 }
diff --git a/src/adapter.h b/src/adapter.h
index 73cd770..602bb6f 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -173,55 +173,6 @@ ssize_t btd_adapter_get_pin(struct btd_adapter *adapter, struct btd_device *dev,
 
 typedef void (*bt_hci_result_t) (uint8_t status, gpointer user_data);
 
-struct btd_adapter_ops {
-	int (*setup) (void);
-	void (*cleanup) (void);
-	int (*set_powered) (int index, gboolean powered);
-	int (*set_discoverable) (int index, gboolean discoverable,
-							uint16_t timeout);
-	int (*set_pairable) (int index, gboolean pairable);
-	int (*start_discovery) (int index);
-	int (*stop_discovery) (int index);
-
-	int (*set_name) (int index, const char *name);
-	int (*set_dev_class) (int index, uint8_t major, uint8_t minor);
-	int (*set_fast_connectable) (int index, gboolean enable);
-	int (*read_clock) (int index, bdaddr_t *bdaddr, int which, int timeout,
-					uint32_t *clock, uint16_t *accuracy);
-	int (*read_bdaddr) (int index, bdaddr_t *bdaddr);
-	int (*block_device) (int index, bdaddr_t *bdaddr, uint8_t bdaddr_type);
-	int (*unblock_device) (int index, bdaddr_t *bdaddr, uint8_t bdaddr_type);
-	int (*get_conn_list) (int index, GSList **conns);
-	int (*disconnect) (int index, bdaddr_t *bdaddr, uint8_t bdaddr_type);
-	int (*remove_bonding) (int index, bdaddr_t *bdaddr, uint8_t bdaddr_type);
-	int (*pincode_reply) (int index, bdaddr_t *bdaddr, const char *pin,
-							size_t pin_len);
-	int (*confirm_reply) (int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
-							gboolean success);
-	int (*passkey_reply) (int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
-							uint32_t passkey);
-	int (*set_did) (int index, uint16_t vendor, uint16_t product,
-					uint16_t version, uint16_t source);
-	int (*add_uuid) (int index, uuid_t *uuid, uint8_t svc_hint);
-	int (*remove_uuid) (int index, uuid_t *uuid);
-	int (*load_keys) (int index, GSList *keys, gboolean debug_keys);
-	int (*set_io_capability) (int index, uint8_t io_capability);
-	int (*create_bonding) (int index, bdaddr_t *bdaddr,
-					uint8_t bdaddr_type, uint8_t io_cap);
-	int (*cancel_bonding) (int index, bdaddr_t *bdaddr);
-	int (*read_local_oob_data) (int index);
-	int (*add_remote_oob_data) (int index, bdaddr_t *bdaddr, uint8_t *hash,
-							uint8_t *randomizer);
-	int (*remove_remote_oob_data) (int index, bdaddr_t *bdaddr);
-	int (*confirm_name) (int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
-							gboolean name_known);
-	int (*load_ltks) (int index, GSList *keys);
-};
-
-int btd_register_adapter_ops(struct btd_adapter_ops *ops, gboolean priority);
-void btd_adapter_cleanup_ops(struct btd_adapter_ops *btd_adapter_ops);
-int adapter_ops_setup(void);
-
 typedef void (*btd_adapter_powered_cb) (struct btd_adapter *adapter,
 						gboolean powered);
 void btd_adapter_register_powered_callback(struct btd_adapter *adapter,
diff --git a/src/main.c b/src/main.c
index 286baa0..a0d6c6f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -54,6 +54,7 @@
 #include "dbus-common.h"
 #include "agent.h"
 #include "manager.h"
+#include "mgmt.h"
 
 #define BLUEZ_NAME "org.bluez"
 
@@ -455,6 +456,7 @@ int main(int argc, char *argv[])
 	uint16_t mtu = 0;
 	GKeyFile *config;
 	guint signal;
+	int mgmt_err;
 
 	init_defaults();
 
@@ -530,8 +532,9 @@ int main(int argc, char *argv[])
 	 * daemon needs to be re-worked. */
 	plugin_init(config, option_plugin, option_noplugin);
 
-	if (adapter_ops_setup() < 0) {
-		error("adapter_ops_setup failed");
+	mgmt_err = mgmt_setup();
+	if (mgmt_err < 0) {
+		error("mgmt setup failed: %s", strerror(-mgmt_err));
 		exit(1);
 	}
 
@@ -558,6 +561,8 @@ int main(int argc, char *argv[])
 	if (config)
 		g_key_file_free(config);
 
+	mgmt_cleanup();
+
 	info("Exit");
 
 	__btd_log_cleanup();
diff --git a/plugins/mgmtops.c b/src/mgmt.c
similarity index 92%
rename from plugins/mgmtops.c
rename to src/mgmt.c
index 27cec09..c55b1a8 100644
--- a/plugins/mgmtops.c
+++ b/src/mgmt.c
@@ -4,6 +4,7 @@
  *
  *  Copyright (C) 2010  Nokia Corporation
  *  Copyright (C) 2010  Marcel Holtmann <marcel@holtmann.org>
+ *  Copyright (C) 2011-2012  Intel Corporation. All rights reserved.
  *
  *  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
@@ -41,7 +42,6 @@
 #include <bluetooth/sdp_lib.h>
 #include <bluetooth/mgmt.h>
 
-#include "plugin.h"
 #include "log.h"
 #include "adapter.h"
 #include "manager.h"
@@ -49,6 +49,7 @@
 #include "event.h"
 #include "oob.h"
 #include "eir.h"
+#include "mgmt.h"
 
 #define MGMT_BUF_SIZE 1024
 
@@ -216,8 +217,7 @@ static int mgmt_set_connectable(int index, gboolean connectable)
 	return mgmt_set_mode(index, MGMT_OP_SET_CONNECTABLE, connectable);
 }
 
-static int mgmt_set_discoverable(int index, gboolean discoverable,
-							uint16_t timeout)
+int mgmt_set_discoverable(int index, gboolean discoverable, uint16_t timeout)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_set_discoverable)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -239,7 +239,7 @@ static int mgmt_set_discoverable(int index, gboolean discoverable,
 	return 0;
 }
 
-static int mgmt_set_pairable(int index, gboolean pairable)
+int mgmt_set_pairable(int index, gboolean pairable)
 {
 	DBG("index %d pairable %d", index, pairable);
 	return mgmt_set_mode(index, MGMT_OP_SET_PAIRABLE, pairable);
@@ -561,7 +561,7 @@ static void mgmt_connect_failed(int sk, uint16_t index, void *buf, size_t len)
 	bonding_complete(info, &ev->addr.bdaddr, ev->status);
 }
 
-static int mgmt_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin,
+int mgmt_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin,
 								size_t pin_len)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_pin_code_reply)];
@@ -642,7 +642,7 @@ static void mgmt_pin_code_request(int sk, uint16_t index, void *buf, size_t len)
 	}
 }
 
-static int mgmt_confirm_reply(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
+int mgmt_confirm_reply(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
 							gboolean success)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_user_confirm_reply)];
@@ -673,7 +673,7 @@ static int mgmt_confirm_reply(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
 	return 0;
 }
 
-static int mgmt_passkey_reply(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
+int mgmt_passkey_reply(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
 							uint32_t passkey)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_user_passkey_reply)];
@@ -827,7 +827,7 @@ static void uuid_to_uuid128(uuid_t *uuid128, const uuid_t *uuid)
 		memcpy(uuid128, uuid, sizeof(*uuid));
 }
 
-static int mgmt_add_uuid(int index, uuid_t *uuid, uint8_t svc_hint)
+int mgmt_add_uuid(int index, uuid_t *uuid, uint8_t svc_hint)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_add_uuid)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -869,7 +869,7 @@ static int mgmt_add_uuid(int index, uuid_t *uuid, uint8_t svc_hint)
 	return 0;
 }
 
-static int mgmt_remove_uuid(int index, uuid_t *uuid)
+int mgmt_remove_uuid(int index, uuid_t *uuid)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_remove_uuid)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -933,7 +933,7 @@ static void read_index_list_complete(int sk, void *buf, size_t len)
 	}
 }
 
-static int mgmt_set_powered(int index, gboolean powered)
+int mgmt_set_powered(int index, gboolean powered)
 {
 	struct controller_info *info = &controllers[index];
 
@@ -952,7 +952,7 @@ static int mgmt_set_powered(int index, gboolean powered)
 	return mgmt_set_mode(index, MGMT_OP_SET_POWERED, powered);
 }
 
-static int mgmt_set_name(int index, const char *name)
+int mgmt_set_name(int index, const char *name)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_set_local_name)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -973,7 +973,7 @@ static int mgmt_set_name(int index, const char *name)
 	return 0;
 }
 
-static int mgmt_set_dev_class(int index, uint8_t major, uint8_t minor)
+int mgmt_set_dev_class(int index, uint8_t major, uint8_t minor)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_set_dev_class)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -1872,7 +1872,7 @@ static gboolean mgmt_event(GIOChannel *io, GIOCondition cond, gpointer user_data
 	return TRUE;
 }
 
-static int mgmt_setup(void)
+int mgmt_setup(void)
 {
 	struct mgmt_hdr hdr;
 	struct sockaddr_hci addr;
@@ -1918,7 +1918,7 @@ fail:
 	return err;
 }
 
-static void mgmt_cleanup(void)
+void mgmt_cleanup(void)
 {
 	g_free(controllers);
 	controllers = NULL;
@@ -1935,7 +1935,7 @@ static void mgmt_cleanup(void)
 	}
 }
 
-static int mgmt_start_discovery(int index)
+int mgmt_start_discovery(int index)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_start_discovery)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -1967,7 +1967,7 @@ static int mgmt_start_discovery(int index)
 	return 0;
 }
 
-static int mgmt_stop_discovery(int index)
+int mgmt_stop_discovery(int index)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_start_discovery)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -1989,7 +1989,7 @@ static int mgmt_stop_discovery(int index)
 	return 0;
 }
 
-static int mgmt_set_fast_connectable(int index, gboolean enable)
+int mgmt_set_fast_connectable(int index, gboolean enable)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_mode)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -2010,7 +2010,7 @@ static int mgmt_set_fast_connectable(int index, gboolean enable)
 	return 0;
 }
 
-static int mgmt_read_clock(int index, bdaddr_t *bdaddr, int which, int timeout,
+int mgmt_read_clock(int index, bdaddr_t *bdaddr, int which, int timeout,
 					uint32_t *clock, uint16_t *accuracy)
 {
 	char addr[18];
@@ -2022,7 +2022,7 @@ static int mgmt_read_clock(int index, bdaddr_t *bdaddr, int which, int timeout,
 	return -ENOSYS;
 }
 
-static int mgmt_read_bdaddr(int index, bdaddr_t *bdaddr)
+int mgmt_read_bdaddr(int index, bdaddr_t *bdaddr)
 {
 	char addr[18];
 	struct controller_info *info = &controllers[index];
@@ -2038,7 +2038,7 @@ static int mgmt_read_bdaddr(int index, bdaddr_t *bdaddr)
 	return 0;
 }
 
-static int mgmt_block_device(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type)
+int mgmt_block_device(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_block_device)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -2067,8 +2067,7 @@ static int mgmt_block_device(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type)
 	return 0;
 }
 
-static int mgmt_unblock_device(int index, bdaddr_t *bdaddr,
-							uint8_t bdaddr_type)
+int mgmt_unblock_device(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_unblock_device)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -2097,7 +2096,7 @@ static int mgmt_unblock_device(int index, bdaddr_t *bdaddr,
 	return 0;
 }
 
-static int mgmt_get_conn_list(int index, GSList **conns)
+int mgmt_get_conn_list(int index, GSList **conns)
 {
 	struct controller_info *info = &controllers[index];
 
@@ -2109,7 +2108,7 @@ static int mgmt_get_conn_list(int index, GSList **conns)
 	return 0;
 }
 
-static int mgmt_disconnect(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type)
+int mgmt_disconnect(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_disconnect)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -2133,7 +2132,7 @@ static int mgmt_disconnect(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type)
 	return 0;
 }
 
-static int mgmt_unpair_device(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type)
+int mgmt_unpair_device(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_unpair_device)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -2158,7 +2157,7 @@ static int mgmt_unpair_device(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type)
 	return 0;
 }
 
-static int mgmt_set_did(int index, uint16_t vendor, uint16_t product,
+int mgmt_set_did(int index, uint16_t vendor, uint16_t product,
 					uint16_t version, uint16_t source)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_set_device_id)];
@@ -2184,7 +2183,7 @@ static int mgmt_set_did(int index, uint16_t vendor, uint16_t product,
 	return 0;
 }
 
-static int mgmt_load_link_keys(int index, GSList *keys, gboolean debug_keys)
+int mgmt_load_link_keys(int index, GSList *keys, gboolean debug_keys)
 {
 	char *buf;
 	struct mgmt_hdr *hdr;
@@ -2233,7 +2232,7 @@ static int mgmt_load_link_keys(int index, GSList *keys, gboolean debug_keys)
 	return err;
 }
 
-static int mgmt_set_io_capability(int index, uint8_t io_capability)
+int mgmt_set_io_capability(int index, uint8_t io_capability)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_set_io_capability)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -2254,7 +2253,7 @@ static int mgmt_set_io_capability(int index, uint8_t io_capability)
 	return 0;
 }
 
-static int mgmt_create_bonding(int index, bdaddr_t *bdaddr, uint8_t addr_type, uint8_t io_cap)
+int mgmt_create_bonding(int index, bdaddr_t *bdaddr, uint8_t addr_type, uint8_t io_cap)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_pair_device)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -2279,7 +2278,7 @@ static int mgmt_create_bonding(int index, bdaddr_t *bdaddr, uint8_t addr_type, u
 	return 0;
 }
 
-static int mgmt_cancel_bonding(int index, bdaddr_t *bdaddr)
+int mgmt_cancel_bonding(int index, bdaddr_t *bdaddr)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_addr_info)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -2302,7 +2301,7 @@ static int mgmt_cancel_bonding(int index, bdaddr_t *bdaddr)
 	return 0;
 }
 
-static int mgmt_read_local_oob_data(int index)
+int mgmt_read_local_oob_data(int index)
 {
 	struct mgmt_hdr hdr;
 
@@ -2318,7 +2317,7 @@ static int mgmt_read_local_oob_data(int index)
 	return 0;
 }
 
-static int mgmt_add_remote_oob_data(int index, bdaddr_t *bdaddr,
+int mgmt_add_remote_oob_data(int index, bdaddr_t *bdaddr,
 					uint8_t *hash, uint8_t *randomizer)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_add_remote_oob_data)];
@@ -2345,7 +2344,7 @@ static int mgmt_add_remote_oob_data(int index, bdaddr_t *bdaddr,
 	return 0;
 }
 
-static int mgmt_remove_remote_oob_data(int index, bdaddr_t *bdaddr)
+int mgmt_remove_remote_oob_data(int index, bdaddr_t *bdaddr)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_remove_remote_oob_data)];
 	struct mgmt_hdr *hdr = (void *) buf;
@@ -2369,7 +2368,7 @@ static int mgmt_remove_remote_oob_data(int index, bdaddr_t *bdaddr)
 	return 0;
 }
 
-static int mgmt_confirm_name(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
+int mgmt_confirm_name(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
 							gboolean name_known)
 {
 	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_confirm_name)];
@@ -2396,7 +2395,7 @@ static int mgmt_confirm_name(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
 	return 0;
 }
 
-static int mgmtops_load_ltks(int index, GSList *keys)
+int mgmt_load_ltks(int index, GSList *keys)
 {
 	char *buf;
 	struct mgmt_hdr *hdr;
@@ -2446,51 +2445,3 @@ static int mgmtops_load_ltks(int index, GSList *keys)
 
 	return err;
 }
-
-static struct btd_adapter_ops mgmt_ops = {
-	.setup = mgmt_setup,
-	.cleanup = mgmt_cleanup,
-	.set_powered = mgmt_set_powered,
-	.set_discoverable = mgmt_set_discoverable,
-	.set_pairable = mgmt_set_pairable,
-	.start_discovery = mgmt_start_discovery,
-	.stop_discovery = mgmt_stop_discovery,
-	.set_name = mgmt_set_name,
-	.set_dev_class = mgmt_set_dev_class,
-	.set_fast_connectable = mgmt_set_fast_connectable,
-	.read_clock = mgmt_read_clock,
-	.read_bdaddr = mgmt_read_bdaddr,
-	.block_device = mgmt_block_device,
-	.unblock_device = mgmt_unblock_device,
-	.get_conn_list = mgmt_get_conn_list,
-	.disconnect = mgmt_disconnect,
-	.remove_bonding = mgmt_unpair_device,
-	.pincode_reply = mgmt_pincode_reply,
-	.confirm_reply = mgmt_confirm_reply,
-	.passkey_reply = mgmt_passkey_reply,
-	.set_did = mgmt_set_did,
-	.add_uuid = mgmt_add_uuid,
-	.remove_uuid = mgmt_remove_uuid,
-	.load_keys = mgmt_load_link_keys,
-	.set_io_capability = mgmt_set_io_capability,
-	.create_bonding = mgmt_create_bonding,
-	.cancel_bonding = mgmt_cancel_bonding,
-	.read_local_oob_data = mgmt_read_local_oob_data,
-	.add_remote_oob_data = mgmt_add_remote_oob_data,
-	.remove_remote_oob_data = mgmt_remove_remote_oob_data,
-	.confirm_name = mgmt_confirm_name,
-	.load_ltks = mgmtops_load_ltks,
-};
-
-static int mgmt_init(void)
-{
-	return btd_register_adapter_ops(&mgmt_ops, TRUE);
-}
-
-static void mgmt_exit(void)
-{
-	btd_adapter_cleanup_ops(&mgmt_ops);
-}
-
-BLUETOOTH_PLUGIN_DEFINE(mgmtops, VERSION,
-		BLUETOOTH_PLUGIN_PRIORITY_LOW, mgmt_init, mgmt_exit)
diff --git a/src/mgmt.h b/src/mgmt.h
new file mode 100644
index 0000000..0658198
--- /dev/null
+++ b/src/mgmt.h
@@ -0,0 +1,80 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2010  Nokia Corporation
+ *  Copyright (C) 2010  Marcel Holtmann <marcel@holtmann.org>
+ *  Copyright (C) 2011-2012  Intel Corporation. All rights reserved.
+ *
+ *  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
+ *
+ */
+
+int mgmt_setup(void);
+void mgmt_cleanup(void);
+
+int mgmt_set_powered(int index, gboolean powered);
+int mgmt_set_discoverable(int index, gboolean discoverable, uint16_t timeout);
+int mgmt_set_pairable(int index, gboolean pairable);
+int mgmt_set_name(int index, const char *name);
+int mgmt_set_dev_class(int index, uint8_t major, uint8_t minor);
+int mgmt_set_fast_connectable(int index, gboolean enable);
+
+int mgmt_start_discovery(int index);
+int mgmt_stop_discovery(int index);
+
+int mgmt_read_clock(int index, bdaddr_t *bdaddr, int which, int timeout,
+					uint32_t *clock, uint16_t *accuracy);
+int mgmt_read_bdaddr(int index, bdaddr_t *bdaddr);
+
+int mgmt_block_device(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type);
+int mgmt_unblock_device(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type);
+
+int mgmt_get_conn_list(int index, GSList **conns);
+
+int mgmt_disconnect(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type);
+
+int mgmt_unpair_device(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type);
+
+int mgmt_add_uuid(int index, uuid_t *uuid, uint8_t svc_hint);
+int mgmt_remove_uuid(int index, uuid_t *uuid);
+
+int mgmt_set_did(int index, uint16_t vendor, uint16_t product,
+					uint16_t version, uint16_t source);
+
+int mgmt_load_link_keys(int index, GSList *keys, gboolean debug_keys);
+int mgmt_load_ltks(int index, GSList *keys);
+
+int mgmt_set_io_capability(int index, uint8_t io_capability);
+
+int mgmt_create_bonding(int index, bdaddr_t *bdaddr, uint8_t addr_type,
+							uint8_t io_cap);
+int mgmt_cancel_bonding(int index, bdaddr_t *bdaddr);
+
+int mgmt_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin,
+								size_t pin_len);
+int mgmt_confirm_reply(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
+							gboolean success);
+int mgmt_passkey_reply(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
+							uint32_t passkey);
+
+int mgmt_read_local_oob_data(int index);
+
+int mgmt_add_remote_oob_data(int index, bdaddr_t *bdaddr,
+					uint8_t *hash, uint8_t *randomizer);
+int mgmt_remove_remote_oob_data(int index, bdaddr_t *bdaddr);
+
+int mgmt_confirm_name(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
+							gboolean name_known);