From 1f6337025a1d53e11ff5429311e8dad7f3bbd3d3 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Sun, 6 Jan 2013 17:51:14 +0200 Subject: [PATCH] core: Move mgmt device connected event handling to adapter code --- src/adapter.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/mgmt.c | 48 +------------------------------------------- 2 files changed, 56 insertions(+), 47 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index d596e4856..db32c7b5e 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -4264,6 +4264,56 @@ static void disconnected_callback(uint16_t index, uint16_t length, dev_disconnected(adapter, &ev->addr, reason); } +static void connected_callback(uint16_t index, uint16_t length, + const void *param, void *user_data) +{ + const struct mgmt_ev_device_connected *ev = param; + struct btd_adapter *adapter = user_data; + struct btd_device *device; + struct eir_data eir_data; + uint16_t eir_len; + char addr[18]; + + if (length < sizeof(*ev)) { + error("Too small device connected event"); + return; + } + + eir_len = btohs(ev->eir_len); + if (length < sizeof(*ev) + eir_len) { + error("Too small device connected event"); + return; + } + + ba2str(&ev->addr.bdaddr, addr); + + DBG("hci%u device %s connected eir_len %u", index, addr, eir_len); + + device = adapter_get_device(adapter, addr, ev->addr.type); + if (!device) { + error("Unable to get device object for %s", addr); + return; + } + + memset(&eir_data, 0, sizeof(eir_data)); + if (eir_len > 0) + eir_parse(&eir_data, ev->eir, eir_len); + + if (eir_data.class != 0) + device_set_class(device, eir_data.class); + + adapter_add_connection(adapter, device); + + if (eir_data.name != NULL) { + const bdaddr_t *bdaddr = adapter_get_address(adapter); + adapter_store_cached_name(bdaddr, &ev->addr.bdaddr, + eir_data.name); + device_set_name(device, eir_data.name); + } + + eir_data_free(&eir_data); +} + static void read_info_complete(uint8_t status, uint16_t length, const void *param, void *user_data) { @@ -4343,6 +4393,11 @@ static void read_info_complete(uint8_t status, uint16_t length, disconnected_callback, adapter, NULL); + mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_CONNECTED, + adapter->dev_id, + connected_callback, + adapter, NULL); + set_dev_class(adapter, adapter->major_class, adapter->minor_class); set_name(adapter, btd_adapter_get_name(adapter)); diff --git a/src/mgmt.c b/src/mgmt.c index 10f21d176..30bf4e335 100644 --- a/src/mgmt.c +++ b/src/mgmt.c @@ -178,52 +178,6 @@ static void mgmt_new_link_key(uint16_t index, void *buf, size_t len) bonding_complete(index, &ev->key.addr, 0); } -static void mgmt_device_connected(uint16_t index, void *buf, size_t len) -{ - struct mgmt_ev_device_connected *ev = buf; - struct eir_data eir_data; - struct btd_adapter *adapter; - struct btd_device *device; - uint16_t eir_len; - char addr[18]; - - if (len < sizeof(*ev)) { - error("Too small device_connected event"); - return; - } - - eir_len = bt_get_le16(&ev->eir_len); - if (len < sizeof(*ev) + eir_len) { - error("Too small device_connected event"); - return; - } - - ba2str(&ev->addr.bdaddr, addr); - - DBG("hci%u device %s connected eir_len %u", index, addr, eir_len); - - if (!get_adapter_and_device(index, &ev->addr, &adapter, &device, true)) - return; - - memset(&eir_data, 0, sizeof(eir_data)); - if (eir_len > 0) - eir_parse(&eir_data, ev->eir, eir_len); - - if (eir_data.class != 0) - device_set_class(device, eir_data.class); - - adapter_add_connection(adapter, device); - - if (eir_data.name != NULL) { - const bdaddr_t *bdaddr = adapter_get_address(adapter); - adapter_store_cached_name(bdaddr, &ev->addr.bdaddr, - eir_data.name); - device_set_name(device, eir_data.name); - } - - eir_data_free(&eir_data); -} - static void mgmt_connect_failed(uint16_t index, void *buf, size_t len) { struct mgmt_ev_connect_failed *ev = buf; @@ -1006,7 +960,7 @@ static gboolean mgmt_event(GIOChannel *channel, GIOCondition cond, mgmt_new_link_key(index, buf + MGMT_HDR_SIZE, len); break; case MGMT_EV_DEVICE_CONNECTED: - mgmt_device_connected(index, buf + MGMT_HDR_SIZE, len); + DBG("device_connected event"); break; case MGMT_EV_DEVICE_DISCONNECTED: DBG("device_disconnected event"); -- 2.47.3