From ea1ed8ec4486e6650d69c69714aeb6a6dcd8783a Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Tue, 10 Jul 2012 10:21:36 -0300 Subject: [PATCH] Move mgmtops to the core daemon Since there is only one "adapter_ops" it doesn't make sense to keep mgmtops as a plugin anymore. This patch moves it to src/mgmt.c. --- Makefile.am | 7 +- src/adapter.c | 161 ++++++++++---------------------- src/adapter.h | 49 ---------- src/main.c | 9 +- plugins/mgmtops.c => src/mgmt.c | 117 +++++++---------------- src/mgmt.h | 80 ++++++++++++++++ 6 files changed, 170 insertions(+), 253 deletions(-) rename plugins/mgmtops.c => src/mgmt.c (93%) create mode 100644 src/mgmt.h diff --git a/Makefile.am b/Makefile.am index 8afb2cc87..009762d35 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 505797fa6..8820e2715 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 73cd7701c..602bb6f62 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 286baa097..a0d6c6f9c 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 93% rename from plugins/mgmtops.c rename to src/mgmt.c index 27cec093d..c55b1a805 100644 --- a/plugins/mgmtops.c +++ b/src/mgmt.c @@ -4,6 +4,7 @@ * * Copyright (C) 2010 Nokia Corporation * Copyright (C) 2010 Marcel Holtmann + * 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 #include -#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 000000000..065819804 --- /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 + * 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); -- 2.47.3